gpt4 book ai didi

c# - 如何从我的主线程中终止 Parallel.ForEach 生成的所有线程?

转载 作者:太空狗 更新时间:2023-10-30 00:08:46 27 4
gpt4 key购买 nike

场景如下:

我有一个正在运行的 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,当进程结束时它会全部被杀死,但我不会手动创建这些线程。

最佳答案

使用 CancellationToken结构体。阅读thisthis获取更多信息。

// 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();

关于c# - 如何从我的主线程中终止 Parallel.ForEach 生成的所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com