すでにTask.WhenAll
が待機しているタスクをリストに追加することはできませんか?Task.WhenAllが待機しているコレクションにタスクを追加する方法はありますか?
すべてのタスクが完了するのを待っていて、初期化後に新しいタスクを作成する可能性があります。しかし、ここではTask.WhenAll
は後でコレクションに追加される新しいタスクを待つことはありません。
List<Task> tasks = new List<Task>();
var task1 = Task.Run(async() =>
{
Debug.WriteLine("task #1 started");
await Task.Delay(TimeSpan.FromSeconds(20));
Debug.WriteLine("task #1 finished");
});
var task2 = Task.Run(async() =>
{
Debug.WriteLine("task #2 started");
await Task.Delay(TimeSpan.FromSeconds(30));
Debug.WriteLine("task #2 finished");
});
var task3 = Task.Run(async() =>
{
Debug.WriteLine("task #3 started");
await Task.Delay(TimeSpan.FromSeconds(10));
var inner = Task.Run(async() =>
{
Debug.WriteLine("inner task started");
await Task.Delay(TimeSpan.FromSeconds(40));
Debug.WriteLine("inner task finished");
});
tasks.Add(inner);
Debug.WriteLine("task #3 finished");
});
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
await Task.WhenAll(tasks);
Debug.WriteLine("All finished");
出力:tasks.Add(inner)
がawait Task.WhenAll(tasks)
後に実行されるため
task #2 started
task #3 started
task #1 started
task #3 finished
inner task started
task #1 finished
task #2 finished
All finished
inner task finished < didn't wait for this to finish
[ソース](https://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,69351c6da968e5d1)を見ると、コレクション/配列が前にコピーされていることがわかります内部のメカニズムが跳ね上がるので、元のコレクションへの変更は観察されません。 –
私はあなたができることは手作業のループだと思う - while(tasks.Count> 0){Task.WhenAll(tasks);を待つ。タスク=タスク。どこ(t =>!t.IsCompleted); } 'スケッチとして –
@Damien_The_Unbelieverありがとうございます。私はこれが最善の解決策だと思う。あなたは答えとしてそれを書かないでしょうか? – Blendester