【发布时间】:2013-12-24 05:02:18
【问题描述】:
我正在使用Multithreading 来解决我的问题。我一直在后台工作人员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 ;
}
在这里,问题是我必须取消长时间运行的作业。假设,有三个请求已经通过parallel.foreach循环,具有MaxDegreeOfParallelism = 3,那么它适用于GetQueryResponse(request)方法,这是一个很长的工作,如果我使用CancellationTokenSource取消线程,那么它不会立即取消进程.只有在执行了 3 个请求线程后才会取消。
我希望它立即取消它。有什么办法可以立即取消Parallel.Foreach产生的所有正在运行的线程,并转到backgroundworker的RunWorkerCompleted事件?
【问题讨论】:
-
至少你应该确保你的代码 sn-ps 在发布之前编译,这不可能是因为
responses在它被声明的范围之外被访问。跨度> -
谢谢 kirill..事实上,上面的 sn-p 是我实际的示例代码...感谢您指出...:)
-
嗯,使用您使用的锁,您没有并行执行任何操作。据我所知...
-
@FelicePollano :我在并行内部也有其他操作。但主要问题发生在responses = GetQueryResponse(request);
标签: c# multithreading c#-4.0 task-parallel-library backgroundworker