Необходимо прервать выполнение некоторой функции, если она выполняется

Тема в разделе ".NET", создана пользователем WoD, 31 мар 2010.

Статус темы:
Закрыта.
  1. WoD

    WoD Гость

    Необходимо прервать выполнение некоторой функции, если она выполняется дольше определённого времени.

    я нашел решение: это создавать поток, и в нём выполнять функцию, и если поток не просигнализировал о завершении - то прерывать его.

    Код (Text):
    private static EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

    [MTAThread]
    public static void Main()
    {
    bool b = false;
    Thread t;
    for (int i = 0; i < 1000; i++ )
    {
    t = new Thread(new ParameterizedThreadStart(ThreadTest));
    t.Start(1000000);
    b = ewh.WaitOne(100, true);
    if (!b) t.Abort();
    }
    }
    public static void ThreadTest(object data)
    {
    //do some work
    ewh.Set();
    }
    но так как это необходимо делать до 1000 раз в секунду - то создание нового потока каждый раз очень сильно замедляет работу

    кто-нибудь может подсказать как это сделать по другому?


    п.с.
    я пробовал делать с помощью асинхронных вызовов делегатов - это не замедляет работу, но я не знаю как прервать их выполнение, если они выполняются слишком долго.
    пробовал через ThreadPool - та же проблема.
    думаю, что как-то можно повторно использовать уже созданный поток(передав ему как-то другие параметры, или через статические переменные), но у меня не получилось.
     
  2. xKlonx

    xKlonx Lotus team
    Lotus team

    Регистрация:
    10 сен 2009
    Сообщения:
    412
    Симпатии:
    0
    А чем вам Timer не подходит?
     
  3. mr_ST

    mr_ST Гость

    Запускать 1000 потоков в секунду? Это нереально. Вообще, стоило бы задачу более детально описать.
     
  4. WoD

    WoD Гость

    использовать таймер для отчёта времени - ещё как-то можно, но как прервать функцию, которая выполняется слишком долго?.....

    естественно это долго, я так и написал, поэтому и спрашиваю можно ли повторно использовать созданный поток, и как его регулировать, или как передавать параметры.
    по поводу задачи - куда уж проще и понятнее:

    из основного потока вызывается некоторая функция(к ней я доступа не имею) мне нужно, чтобы если эта функция выполняется дольше, допустим пол секунды, прервать её выполнение, и продолжить выполнение основной программы.

    притом, хочу заметить, что нормальное время работы этой функции примерно до 10мс, и соответственно она может выполняться 100 - 500 раз в секунду.
     
  5. mr_ST

    mr_ST Гость

    Всё упирается в то что потокам приходится делать аборт и, соответсвенно, создавать новые потоки взамен прибитых. Единственное что приходит в голову:
    Есть потокобезопасная очередь "заданий" к-я содержит уже созданные спящие/suspend потоки. Т.е. эдакий своеобразный пул.
    Имеем два потока А - главный, который вытаскивает из очереди "задания" и запускает их
    B - поток который создает задания и запихиват в очередь. Очередь должна быть фиксированного размера дабы не держать огромное кол-во потоков одновременно.

    Рещение на самом деле не ахти т.к.
    1) Будет эффективно скорее всего только на многоядерном процессоре (как минимум 2 ядра) и то при условии что наши неконтролируемые фунции не запускают свои потоки.
    2) Из-за затрат на синхронизацию и гранулярности переключения контекста потоков может не получиться обеспечить нужный темп выполнения функций. Вряд-ли удастся запускать задания чаще чем одно в 10 мс.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей