簡體   English   中英

在C#中完成任務后如何停止所有任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM