Скажите, запущен ли поток событий «истек»? - PullRequest
1 голос
/ 29 октября 2008

С учетом System.Timers.Timer, есть ли способ из основного потока узнать, работает ли еще рабочий поток, на котором выполняется истекший код события?

Другими словами, как можно убедиться, что код, запущенный в рабочем потоке, в данный момент не выполняется, перед остановкой таймера или основного потока приложения / службы, в котором работает таймер?

Это вопрос отключения таймера для использования потоков в таймере с использованием состояния или просто пора использовать потоки напрямую?

Ответы [ 2 ]

1 голос
/ 29 октября 2008

Посмотрите ManualResetEvent, так как он сделан именно для того, что вы просите.

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

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();

Я могу дать вам больше примеров кода, если вы хотите, но я просто скопировал его из пары статей, которые я прочитал, когда мне пришлось делать это год назад или около того.


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

...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
  myCustomObjectThatContainsAResetEvent);
0 голосов
/ 29 октября 2008

Для готового решения нет пути. Основная причина в том, что поток, выполняющий функцию TimerCallback, по всей вероятности, все еще жив, даже если код, выполняющий обратный вызов, завершен. TimerCallback выполняется потоком из ThreadPool. Когда задача завершена, поток не умирает, а возвращается в очередь для следующей задачи пула потоков.

Для того, чтобы заставить это работать, вам придется использовать метод многопоточной сигнализации, чтобы определить, что операция завершена.

Документация по таймеру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...