繁体   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