![](/img/trans.png)
[英]C# async, Stop all tasks when one is finished without the access to the code
[英]How to stop all tasks when one is finished in c#
我有不同的任務要從不同的文件讀取並在其中找到單詞。 我將它們放入一個以waitAny方法開始的任務數組中,如下所示:
foreach (string file in filesList)
{
files[i] = Task.Factory.StartNew(() =>
{
mySearch.Invoke(file);
});
i++;
}
System.Threading.Tasks.Task.WaitAny(files);
我想在其中一項任務完成后立即停止所有其他任務(找到單詞后即完成)。 目前,使用waitany,我可以知道一個任務何時完成,但是我不知道如何知道哪個任務已經完成以及如何停止其他任務。 實現此目標的最佳方法是什么?
您可以使用所有任務將共享的單個CancellationToken
。 里面mySearch.Invoke
方法驗證的價值token.IsCancellationRequested
取消任務。 完成某些任務后,請通過CancellationTokenSource.Cancel()
取消其他任務。
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
foreach (string file in filesList)
{
// pass cancellation token to your task
files[i] = Task.Factory.StartNew(() => mySearch.Invoke(file, token), token);
i++;
}
Task.WaitAny(files);
tokenSource.Cancel();
順便說一句 ,當通過調用token.ThrowIfCancellationRequested()
取消源時,您可以強制令牌拋出OperationCanceledException
token.ThrowIfCancellationRequested()
創建任務時,可以傳遞CancellationToken 。 其中一項任務完成時,請設置此令牌。 這將導致其余帶有此令牌的任務無法執行 。 運行中的任務可以接收OperationCanceledException
並停止。
我強烈建議您閱讀如何取消不可取消的異步操作? 由Stephen Toub。 本質上,您需要做的是取消所有這些任務,但是目前您沒有機制來取消它們。
理想的方法是在foreach之前創建一個CancellationTokenSource
,將CancellationToken
從該源傳遞到每個子任務,定期檢查該令牌,並在發現已指示取消時停止工作。 然后,您可以在WhenAny
延續中取消令牌源。
如果這不是一個選擇,則需要確定實際上停止任務是否很重要(這實際上是無法完成的),或者僅需繼續執行代碼而無需等待它們完成(這很容易)去做)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.