C# 如何从主线程杀死Parallel.ForEach生成的所有线程?

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

以下是场景:

我有一个正在运行的Windows服务
OnStart()
它设置了一个调用函数的计时器(我们称之为
ProcessEvent()
)。
ProcessEvent
中的代码是一个关键部分,因此只有一个线程可以执行以下操作:

private void ProcessEvent(object sender, ElapsedEventArgs e)
{
    lock(lockObj)
    {
        string[] list = GetList();
        Parallel.ForEach(list, item => { ProcessItem(item) });
    }
}
ProcessItem
可能需要很长时间

现在,当服务停止时,my
OnStop()
当前只是停止并处理计时器。然而,我注意到,即使在服务停止后,仍有线程在运行
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:它会导致任何“侦听”它的线程自行结束(假设代码正确遵守取消协议)。