以下是场景:
我有一个正在运行的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
中等待锁的线程)?
我知道如果我自己创建了线程,我可以将 isBackground
设置为 true,当进程结束时它们都会被杀死,但我没有手动创建这些线程。
cts.Cancel()
是取消所有线程还是只取消当前线程,以便它自己被取消? - anmarti