Вот сценарий:
У меня запущена служба Windows.OnStart()
устанавливает таймер, который будет вызывать функцию (назовем ее ProcessEvent()
).Код внутри ProcessEvent
является критическим разделом, поэтому только один поток может сделать следующее:
private void ProcessEvent(object sender, ElapsedEventArgs e)
{
lock(lockObj)
{
string[] list = GetList();
Parallel.ForEach(list, item => { ProcessItem(item) });
}
}
ProcessItem
потенциально может занять много времени.
Теперь, когда служба работаетостановил мой OnStop()
в данный момент просто останавливается и избавляется от таймера.Однако я заметил, что даже после остановки службы существуют потоки, которые все еще работают ProcessItem()
.
Итак, как я могу уничтожить все запущенные потоки, созданные этой программой (в основном те, которые были созданы Parallel.ForEach
, но также и те, которые ожидают блокировки в ProcessEvent
)?
IЯ знаю, что если бы я сам создал поток, я мог бы установить для isBackground
значение true, и все это будет убито, когда процесс умрет, но я не создаю эти потоки вручную.