【发布时间】:2019-09-17 03:52:06
【问题描述】:
我有一个这样的异步方法:
private async Task SendAsync(string text) {
...
}
我还必须对 List 中的每个项目使用此方法一次:
List<string> textsToSend = new Service().GetMessages();
目前我的实现是这样的:
List<string> textsToSend = new Service().GetMessages();
List<Task> tasks = new List<Task>(textsToSend.Count);
textsToSend.ForEach(t => tasks.Add(SendAsync(t)));
await Task.WhenAll(tasks);
使用此代码,对于运行async 发送方法的每条消息,我都会得到一个Task。
但是,我不知道我的实现和这个有什么不同:
List<string> textsToSend = new Service().GetMessages();
textsToSend.ForEach(async t => await SendAsync(t));
在第二个中,我没有List<Task> 分配,但我认为第一个并行启动所有Task,第二个样本一个一个。
您能否帮我澄清一下第一个和第二个样本之间是否有任何不同?
PD:我也知道 C#8 支持 foreach 异步,但我使用的是 C# 7
【问题讨论】:
-
第二个无法正常工作,因为
ForEach无法与异步委托一起使用,因此它将被转换为Action,而这反过来又无法等待。
标签: c# .net asynchronous async-await