我正在使用Multithreading
來解決我的問題。我一直在使用Parallel.Foreach
在後臺工作人員DoWork
事件中執行長時間運行的作業。但是,當我不得不取消工作時會出現問題。它不會立即取消線程。立即取消所有正在運行的C#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
,那麼它就是GetQueryResponse(request)
這個長工作的方法,如果我用CancellationTokenSource
取消線程,那麼它不會立即取消這個進程。它只在執行3請求線程後才取消。
我想立即取消它。是否有立即取消Parallel.Foreach
生成的所有正在運行的線程並轉到RunWorkerCompleted
背景工作者事件的方法?
至少你應該確保你的代碼片段在發佈之前編譯,由於'response'被聲明的範圍以外訪問,這可能不是這種情況。 –
感謝kirill..Indeed,上面的代碼段是我的實際代碼的示例代碼...感謝您指出...... :) –
呃,隨着你使用的鎖,你沒有任何並行的東西。據我所知... –