ОБСУЖДЕНИЕ

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

4 ответов 7,6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

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

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

Код:
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 - та же проблема.
думаю, что как-то можно повторно использовать уже созданный поток(передав ему как-то другие параметры, или через статические переменные), но у меня не получилось.
 
А чем вам Timer не подходит?
 
Запускать 1000 потоков в секунду? Это нереально. Вообще, стоило бы задачу более детально описать.
 
А чем вам Timer не подходит?
использовать таймер для отчёта времени - ещё как-то можно, но как прервать функцию, которая выполняется слишком долго?.....

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

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

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

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

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