如何在Parallel.ForEach中使用CancellationTokenSource

问题描述 投票:0回答:1

有这个处理程序:

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();
}

这可行,但想知道我在这里使用的

CancellationTokenSource
是否正确?

c# .net parallel.foreach cancellationtokensource
1个回答
0
投票

您使用

CancellationTokenSource
作为布尔变量,目标是如果满足某些条件则取消批次,那么用法是完全错误的,您需要将令牌传递给
ForEachAsync
(最好在身体)。沿着这些思路:

try
{
    await Parallel.ForEachAsync(myList, cancellationTokenSource.Token, async (objectId, ct) =>
     {
         var result = await _service.GetObject(objectId, ct);

         if (result.Any())
         {
             cancellationTokenSource.Cancel();
         }
     });
}
catch (TaskCanceledException e)
{
    Result.Fail("Error message.");
}
© www.soinside.com 2019 - 2024. All rights reserved.