先来看这个简单的方法:
Public Iterator Function GetLongRunningTasks(count As Long) As IEnumerable(Of Task)
For i = 1 To count
Yield Task.Delay(3000)
Next
End Function
此方法返回指定数量的任务,每个任务在启动后 3 秒完成。让我们称其为在极差的网络连接上模拟网络 API 调用(没关系)。
我的问题是一个简单的迭代将一次启动一个任务,因此每次迭代之间都会发生 3000 毫秒的延迟。
For Each t In GetLongRunningTasks(50)
Await t
Next ' this takes ~150 seconds to complete (50x3000ms)
我想要做的是一次启动所有 50 个任务,然后进入 foreach 循环。最好坚持上面的例子,这样做的正确方法是什么?
编辑
正如斯蒂芬所建议的那样,一种解决方案是迭代GetLongRunningTasks(50).ToList()
. 也许只有我一个人,但我认为在阅读代码时使用 ToList 的原因并不明显。
我想知道以下片段是否完全相同?
Dim tasks As New List(Of Task)
tasks.AddRange(GetLongRunningTasks(50))
For Each t In tasks
Await t
Next