繁体   English   中英

停止 Parallel.ForEachAsync

[英]Stop Parallel.ForEachAsync

在 C# 中,我有兴趣停止Parallel.ForEachAsync循环(考虑到StopBreak之间的差异); 对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM