gpt4 book ai didi

c# - ForEach() 方法中的异步 lambda 是如何处理的?

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

我们在我们的产品中遇到了一个错误,并将其简化为以下问题。
给定一个列表并使用异步 lambda 调用 ForEach-Extension 方法,输出的预期顺序是什么:

public static async Task Main()
{
var strings = new List<string> { "B", "C", "D" };
Console.WriteLine("A");
strings.ForEach(async s => { await AsyncMethod(s); } );
Console.WriteLine("E");
}

private static async Task AsyncMethod(string s)
{
await Task.Run(() => { Console.WriteLine(s); });
}

我们期望它总是 A、B、C、D、E。但有时是 A,B,C,E,D 或 A,B,E,D,C

我们认为这两行是等价的:
strings.ForEach(async s => { await AsyncMethod(s); });

foreach (var s in strings) await AsyncMethod(s);

有人能解释一下区别在哪里吗?这些异步 lambda 是如何执行的,为什么不等待它们?

澄清:问题不是B,C,D的顺序。问题是E在循环完成之前出现

最佳答案

foreach (var s in strings) await AsyncMethod(s);

你误解了这是如何工作的。这些是按顺序执行的步骤:

  1. Handle "B" asynchronously.
  2. Wait for (1).
  3. Handle "C" asynchronously.
  4. Wait for (3).
  5. Handle "D" asynchronously.
  6. Wait for (5).

await是每次迭代的一部分。在当前迭代完成之前,下一次迭代不会开始。

由于不是异步处理任务,这些顺序任务将按照它们开始的顺序完成。
strings.ForEach(async s => { await AsyncMethod(s); });

另一方面,这有不同的工作方式:

  1. Handle "B" asynchronously.
  2. Handle "C" asynchronously.
  3. Handle "D" asynchronously.

ForEach启动任务,但不会立即等待它们。由于异步处理的性质,每次运行代码时,这些并发任务可以以不同的顺序完成。

因为没有任何东西等待由 ForEach 产生的任务。 ,立即启动“E”任务。 BCDE 都是异步处理的,可以以任意顺序完成。

您可以重新设计您的 foreach示例匹配您的 ForEach例子:
foreach (var s in strings) 
{
AsyncMethod(s);
}

现在,处理与 ForEach 中的相同:

  1. Handle "B" asynchronously.
  2. Handle "C" asynchronously.
  3. Handle "D" asynchronously.


但是,如果要确保仅在 BCD 全部完成后才启动 E 任务,只需将 BCD 任务放在一个集合中等待它们:
foreach (var s in strings) 
{
myTaskList.Add(AsyncMethod(s));
}

await Task.WhenAll(myTaskList);

  1. Handle "B" asynchronously and add its task to the list.
  2. Handle "C" asynchronously and add its task to the list.
  3. Handle "D" asynchronously and add its task to the list.
  4. Wait for all tasks in the list before doing anything else.

关于c# - ForEach() 方法中的异步 lambda 是如何处理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48945657/

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