gpt4 book ai didi

c# - 立即取消所有正在运行的C# Parallel.Foreach 线程

转载 作者:行者123 更新时间:2023-11-30 17:50:27 24 4
gpt4 key购买 nike

我正在使用多线程 来解决我的问题。我一直在后台工作程序 DoWork 事件中使用 Parallel.Foreach ,其中执行了长时间运行的作业。但是,当我不得不取消工作时,问题就出现了。它不会立即取消线程。

BackgroundWorker DoWork 事件:

private void File_DoWork(object sender, DoWorkEventArgs e)
{
var cts = new CancellationTokenSource();
btnCancel.Click += (cancelSender, cancelEvent) =>
{
bgwFile.CancelAsync();

if (bgwFile.CancellationPending)
{
cts.Cancel();
e.Cancel = true;
}
};
object sync = new object();
List<Response> responses = null;

var parallelOperation = new ParallelOptions
{
MaxDegreeOfParallelism = 3,
CancellationToken = cts.Token
};

Parallel.ForEach(listRequest, parallelOperation, request =>
{
lock (sync)
{
responses = GetQueryResponse(request); // Long running process
parallelOperation.CancellationToken.ThrowIfCancellationRequested();
}
});
e.Result = responses ;
}

这里,问题是我必须取消长时间运行的作业。假设,有三个请求已经通过具有 MaxDegreeOfParallelism = 3 的 parallel.foreach 循环,然后它进入 GetQueryResponse(request) 方法,如果我取消,这是一个很长的工作使用 CancellationTokenSource 的线程,则它不会立即取消进程。它仅在执行 3 个请求线程后取消。

我希望它立即取消。是否有任何方法可以立即取消 Parallel.Foreach 生成的所有正在运行的线程并转到后台工作程序的 RunWorkerCompleted 事件?

最佳答案

您可以使用 CancellationToken.Register Method (Action)注册一个将在取消此 CancellationToken 时调用的委托(delegate)。

一旦请求取消,它就会被触发。当然,您必须编写使当前 GetQueryResponse 执行立即停止的逻辑。

关于c# - 立即取消所有正在运行的C# Parallel.Foreach 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755116/

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