[英]Stop Parallel.ForEachAsync
在 C# 中,我有兴趣停止Parallel.ForEachAsync
循环(考虑到Stop
和Break
之间的差异); 对于Parallel.ForEach
我可以执行以下操作:
Parallel.ForEach(items, (item, state) =>
{
if (cancellationToken.IsCancellationRequested)
{
state.Stop();
return;
}
// some process on the item
Process(item);
});
但是,由于我有一个需要异步执行的进程,所以我切换到使用Parallel.ForEachAsync
。 ForEachAsync
没有Stop()
方法,我可以按以下方式break
循环,但我想知道这是否是打破外观的最有效方法(换句话说,循环需要在它收到取消请求)。
await Parallel.ForEachAsync(items, async (item, state) =>
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
// some async process on the item
await ProcessAsync(item);
});
Parallel.ForEachAsync
lambda 有一个CancellationToken
作为其第二个参数。 此令牌由 API 提供,它与您在ParallelOptions
中传递的令牌不同。 您可以将此令牌转发到您在 lambda 内调用的任何异步方法。 如果您调用不可取消的方法,那么您可以做的最好的事情是在ThrowIfCancellationRequested
内的战略位置调用 ThrowIfCancellationRequested:
var cts = new CancellationTokenSource();
var options = new ParallelOptions() { CancellationToken = cts.Token };
await Parallel.ForEachAsync(items, options, async (item, ct) =>
{
//...
ct.ThrowIfCancellationRequested();
//...
await ProcessAsync(item, ct);
//...
ct.ThrowIfCancellationRequested();
//...
});
你将需要这样的东西:
await Parallel.ForEachAsync(items, async (item, state) =>
{
await ProcessAsync(item, cancellationToken);
});
async Task ProcessAsync(string item, CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
//Process
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.