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)
这是因为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迭代器内等待。