不会减慢任务循环,并知道何时返回结果

时间:2013-02-05 21:19:02

标签: c# task-parallel-library

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);
    }
} 

这将贯穿任务循环,但是你怎么知道结果何时全部存在而不影响循环的速度?

1 个答案:

答案 0 :(得分: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之前简单地启动任务。这是一个简单的例子,只有两个任务:

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

这将执行第一个任务,然后执行第二个任务。

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

await task1;
await task2;

这将启动两个任务,然后在两个任务完成后继续,然后允许同时运行。