我正在使用多线程
方法解决我的问题。我一直在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 ;
}
在这里,问题是当我需要取消长时间运行的作业时。假设有三个请求通过并行.foreach循环并具有
MaxDegreeOfParallelism = 3
,然后它进入长时间执行的GetQueryResponse(request)
方法,如果我使用CancellationTokenSource
取消线程,则不会立即取消进程。它只会在执行3个请求线程之后才取消。我希望能够立即取消它。是否有任何方法可以立即取消由
Parallel.Foreach
产生的所有正在运行的线程并转到backgroundworker的RunWorkerCompleted
事件?