在 ForEach 中等待/异步的正确等待是什么?

Bri*_*itt 2 c# asynchronous async-await

.NET 核心 2.2,VS 2019

问题是,UpdateDatabaseWithFile永远不会被执行?我在这里做错了什么?我试图Directory用等待来包装,但我不能,因为它返回无效。这样做的正确方法是什么?

这是代码:

Directory
   .GetFiles(@"C:\Temp")
   .ToList()
   .ForEach(async file =>
   {
        await this._dataService.UpdateDatabaseWithFile();
   });
Run Code Online (Sandbox Code Playgroud)

Far*_*yev 8

这是因为ForEach<T>只是执行了那些async函数,而没有等待它们的完成。

您可以Select用于投影Task必须执行的 s,然后用于 Task.WhenAll()执行该函数并等待它们完成:

 var tasks = Directory
        .GetFiles(@"C:\Temp")
        .Select(async file =>
        {
            await this._dataService.UpdateDatabaseWithFile();
        });


 await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想按顺序执行函数,那么Task.WhenAll()您可以使用 simple foreach

 foreach (var file in Directory.GetFiles(@"C:\Temp"))
 {
      await this._dataService.UpdateDatabaseWithFile();
 }
Run Code Online (Sandbox Code Playgroud)

补充说明:

下面是实现ForEach<T>

 for(int i = 0 ; i < array.Length; i++) {
       action(array[i]);
  }
Run Code Online (Sandbox Code Playgroud)

如您所见,它只是执行该操作,但没有等待它们的完成。而实际上,它不能。Action什么都不返回。但等待Task必须返回。因此,为了使ForEach函数在这种情况下有用,它必须采用Funcwhich 返回Task,然后在for迭代器内等待。