gpt4 book ai didi

c# - 在 ForEach 内部等待异步的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 11:07:47 26 4
gpt4 key购买 nike

.NET Core 2.2,VS 2019

问题是,UpdateDatabaseWithFile 永远不会被执行?我在这里做错了什么?我尝试用await 包装Directory,但我不能,因为它返回void。执行此操作的正确方法是什么?

这是代码:

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

最佳答案

因为ForEach<T>只是执行async函数,但没有等待其完成。

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

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


await Task.WhenAll(tasks);

或者,如果您想顺序执行函数,则代替 Task.WhenAll()您可以使用简单的 foreach :

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

附加说明:

Here是执行ForEach<T> :

 for(int i = 0 ; i < array.Length; i++) {
action(array[i]);
}

如您所见,它只是执行该操作,但没有等待其完成。事实上,它不能。 Action什么也不返回。但等待Task必须归还。所以,为了制作ForEach函数在这种情况下很有用,它必须采取 Func返回 Task然后在for里面等待迭代器..

关于c# - 在 ForEach 内部等待异步的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518243/

26 4 0
文章推荐: c# - 如何在c#中自动更新属性
文章推荐: java - 如何将 RealVector 与 RealMatrix 相乘?
文章推荐: c# - 调试 WPF 时遇到问题
文章推荐: asp.net-mvc-2 - MVC 的 DataAnnotationsModelMetadataProvider 中的 "Func modelAccessor"参数是什么?