![](/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.