C# 如何从主线程杀死Parallel.ForEach生成的所有线程?
以下是场景: 我有一个正在运行的Windows服务C# 如何从主线程杀死Parallel.ForEach生成的所有线程?,c#,multithreading,.net-4.0,kill,plinq,C#,Multithreading,.net 4.0,Kill,Plinq,以下是场景: 我有一个正在运行的Windows服务OnStart()它设置了一个调用函数的计时器(我们称之为ProcessEvent())。ProcessEvent中的代码是一个关键部分,因此只有一个线程可以执行以下操作: private void ProcessEvent(object sender, ElapsedEventArgs e) { lock(lockObj) { string[] list = GetList(); Parallel
OnStart()
它设置了一个调用函数的计时器(我们称之为ProcessEvent()
)。ProcessEvent
中的代码是一个关键部分,因此只有一个线程可以执行以下操作:
private void ProcessEvent(object sender, ElapsedEventArgs e)
{
lock(lockObj)
{
string[] list = GetList();
Parallel.ForEach(list, item => { ProcessItem(item) });
}
}
ProcessItem
可能需要很长时间
现在,当服务停止时,myOnStop()
当前只是停止并处理计时器。然而,我注意到,即使在服务停止后,仍有线程在运行ProcessItem()
那么,我如何杀死这个程序生成的所有正在运行的线程(主要是那些由Parallel.ForEach
生成的线程,还有那些在ProcessEvent
中等待锁的线程)
我知道,如果我自己创建了线程,我可以将
isBackground
设置为true,当进程终止时,它将全部被终止,但我不会手动创建这些线程。查看带参数的委托的重载。检查主体中的标志,查看是否应继续执行,否则将其终止:
Parallel.ForEach(list, (item, pls) => {
if(quit)pls.Stop();
else
ProcessItem(item);
});
使用该结构。阅读和了解更多信息
// Setup the cancellation mechanism.
var cts = new CancellationTokenSource();
var po = new ParallelOptions();
po.CancellationToken = cts.Token;
// Run the enumerator in parallel.
Parallel.ForEach(list, po,
(item) =>
{
ProcessItem(item);
po.CancellationToken.ThrowIfCancellationRequested();
});
// Call Cancel to make Parallel.ForEach throw.
// Obviously this must done from another thread.
cts.Cancel();
在这种情况下,什么是退出?我只在顶部设置了一面旗子()?非常感谢!由计时器生成的线程在
ProcessEvent
中等待锁时会发生什么情况?这些线程是自动被杀死的吗?这不会启动任何新线程;它对已经启动的线程没有帮助。好极了!虽然我喜欢spender的解决方案,但这一个比较干净,因为我自己不必维护标志。这是cts.Cancel()
取消所有线程还是仅取消当前线程,所以它会自动取消?@anmarti:它会导致任何“侦听”它的线程自行结束(假设代码正确遵守取消协议)。