我正在尝试如何打破循环ForEachAsync。break不起作用,但我可以调用CancelCancellationTokenSource。的签名ForEachAsync有两个标记 - 一个作为独立参数,另一个在Func主体签名中。
我注意到,当cts.Cancel()调用时,token和t变量都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) 拥有这个处理程序:
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