Скажите, запущен ли поток событий «истек»?

StackOverflow https://stackoverflow.com/questions/245866

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Посмотрите 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);

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top