gpt4 book ai didi

c# - .NET 6 Parallel.ForEachAsync 中需要两个 token 吗?

转载 作者:行者123 更新时间:2023-12-05 04:40:51 26 4
gpt4 key购买 nike

我正在试验如何跳出 ForEachAsync 循环。 break 不起作用,但我可以在 CancellationTokenSource 上调用 CancelForEachAsync 的签名有两个标记 - 一个作为独立参数,另一个在 Func 正文签名中。

我注意到当 cts.Cancel() 被调用时,tokent 变量都有 IsCancellationRequested 设置为真。所以,我的问题是:两个单独的 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();
}

最佳答案

传递给 ForEachAsync 调用的方法主体的 token 是不同的,来自内部 CancellationTokenSource将被取消:

  • 关于“外部”cancelation (这就是为什么在调用 cts.Cancel() 时您会看到 t.IsCancellationRequested 设置为 true 的原因)
  • 出于内部原因(我发现的原因 - 任何迭代 has thrown an uncaught exception)。

因此传递给 Parallel.ForEachAsynccancellationToken CancellationToken 参数的目的是支持调用者取消以及传递给它调用的异步委托(delegate)的取消 - 支持由外部(即调用者)和内部来源(见 P.S.)取消。

附言

另请注意,通常在您的方法中传递和检查 token 状态是个好主意(即 await someConditionAsync(t) 以及内部的相应实现),因为 CancelationToken用于所谓的cooperative cancelation .

关于c# - .NET 6 Parallel.ForEachAsync 中需要两个 token 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70191295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com