この簡単な方法を最初に見てください。
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呼び出しのシミュレーションと呼びましょう(重要ではありません)。
私の問題は、単純な反復で一度に1つずつタスクが開始されるため、各反復の間に3000ミリ秒の遅延が発生することです。
For Each t In GetLongRunningTasks(50)
Await t
Next ' this takes ~150 seconds to complete (50x3000ms)
私がやりたいのは、50のタスクすべてを一度に開始し、その後foreachループに入るということです。できれば上記の例に固執して、これを行うための適切な方法は何ですか?
編集
Stephenが提案したように、1つの解決策はを繰り返すことGetLongRunningTasks(50).ToList()
です。たぶんそれは私だけですが、コードを読んだときにToListが使用される理由はまったく明らかではないと思います。
次のスニペットはまったく同じでしょうか?
Dim tasks As New List(Of Task)
tasks.AddRange(GetLongRunningTasks(50))
For Each t In tasks
Await t
Next