相关疑难解决方法(0)

.NET 6 Parallel.ForEachAsync 中需要两个取消令牌吗?

我正在尝试如何打破循环ForEachAsyncbreak不起作用,但我可以调用CancelCancellationTokenSource。的签名ForEachAsync有两个标记 - 一个作为独立参数,另一个在Func主体签名中。

我注意到,当cts.Cancel()调用时,tokent变量都IsCancellationRequested设置为 true。所以,我的问题是:这两个单独的论点的目的是什么token?有什么值得注意的区别吗?

List<string> symbols = new() { "A", "B", "C" };
var cts = new CancellationTokenSource();
var token = cts.Token;
token.ThrowIfCancellationRequested();

try
{
    await Parallel.ForEachAsync(symbols, token, async (symbol, t) =>
    {
        if (await someConditionAsync())
        {
            cts.Cancel();
        }
    });
catch (OperationCanceledException oce)
{
    Console.WriteLine($"Stopping parallel loop: {oce}");
}
finally
{
    cts.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

c# cancellation cancellation-token parallel.foreachasync

4
推荐指数
1
解决办法
3446
查看次数

如何在 Parallel.ForEachAsync 中使用 CancellationTokenSource

拥有这个处理程序:

public async Task<Result> Handle(MyQuery request, CancellationToken cancellationToken)
{
     var cancellationTokenSource = new CancellationTokenSource();

     await Parallel.ForEachAsync(myList, async (objectId, _) =>
     {
         var result = await _service.GetObject(objectId);

         if (result.Any())
         {
             cancellationTokenSource.Cancel();
         }
     });

     if (cancellationTokenSource.IsCancellationRequested) return Result.Fail("Error message.");

     return Result.Ok();
}
Run Code Online (Sandbox Code Playgroud)

这可行,但想知道我CancellationTokenSource在这里使用是否正确?

.net c# async-await cancellationtokensource parallel.foreachasync

1
推荐指数
1
解决办法
61
查看次数