有这个处理程序:
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
是否正确?
您使用
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.");
}