2
Task<string> RunList(int client)
{
    return pages[client];
}

private async void Form1_DoubleClick(object sender, EventArgs e)
{
    for (int x = 0; x < listBox1.Items.Count; x++)
    {
        RunList(x);
    }
} 

これはタスクのループを通過しますが、ループの速度を犠牲にすることなく、結果がすべて入っていることをどのようにして知ることができますか?

4

1 に答える 1

5

awaitの結果に基づいて、WhenAllすべてのタスクがコードのその時点で完了したことを確認できます。WaitAll( UI スレッドをブロックするので、ここでは使用しないことが重要です。)

private async void Form1_DoubleClick(object sender, EventArgs e)
{
    var tasks = new List<Task<string>>();
    for (int x = 0; x < listBox1.Items.Count; x++)
    {
        tasks.Add(RunList(x));
    }
    await Task.WhenAll(tasks);
}

ここでの基本的な考え方は、タスクを呼び出す前に単純にタスクを開始するawaitことです。2 つのタスクのみを使用した簡単な例を次に示します。

await Task.Delay(1000);
await Task.Delay(1000);

これにより、最初のタスクが実行され、次に2 番目のタスクが実行されます。

var task1 =  Task.Delay(1000);
var task2 =  Task.Delay(1000);

await task1;
await task2;

これにより、両方のタスクが開始され、両方のタスクが終了した後に続行され、同時に実行できるようになります。

于 2013-02-05T21:23:46.700 に答える