如何在c#中完成任务后停止所有任务

Ray*_*jax 5 c# parallel-processing task multiprocessing

我有不同的任务从不同的文件中读取并在其中找到一个单词.我把它们放入一个任务数组,我从waitAny方法开始,如下所示:

foreach (string file in filesList)
        {
            files[i] = Task.Factory.StartNew(() =>
            {
                mySearch.Invoke(file);
            });
            i++;
        }
        System.Threading.Tasks.Task.WaitAny(files);
Run Code Online (Sandbox Code Playgroud)

我想在其中一个任务完成后立即停止所有其他任务(它在找到该单词时结束).目前,有了waitany,我可以知道一个任务什么时候结束,但我不知道怎么知道哪一个完成了以及如何停止其他任务.实现这一目标的最佳方法是什么?

Ser*_*kiy 3

您可以使用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();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,OperationCanceledException当源被取消时,您可以通过调用强制抛出令牌token.ThrowIfCancellationRequested()