带参数的任务列表

时间:2015-02-22 16:37:17

标签: c# .net task-parallel-library async-await dotnet-httpclient

我需要创建一个任务列表来执行一个带有一个参数的例程,然后在继续执行其余的程序代码之前等待这些任务完成。这是一个例子:

List<Task> tasks = new List<Task>();
foreach (string URL in LIST_URL_COLLECTION)
{
    tasks[i] = Task.Factory.StartNew(
        GoToURL(URL)
        );
}
//wait for them to finish
Console.WriteLine("Done");

我已经用Google搜索并搜索了这个网站,但我只是一直走到了尽头,我曾经做过一次,但不记得如何。

1 个答案:

答案 0 :(得分:4)

Task Parallel Library公开了一种通过Task.WhenAll方法异步等待所有任务完成的方法。该方法自行返回Task,这是等待的,应该等待:

public async Task QueryUrlsAsync()
{
    var urlFetchingTasks = ListUrlCollection.Select(url => Task.Run(url));
    await Task.WhenAll(urlFetchingTasks);
    Console.WriteLine("Done");
}

请注意,为了await,您的方法必须在方法签名中使用async修饰符进行标记,并返回Task(如果它没有返回值)或Task<T>(如果确实有返回值,类型为T)。

作为旁注,您的方法看起来像是在提取URL,我假设它正在向某个端点生成Web请求。为了做到这一点,不需要通过Task.Factory.StartNewTask.Run使用额外的线程,因为这些操作是自然异步。你应该以HttpClient为出发点。例如,您的方法可能如下所示:

public async Task QueryUrlsAsync()
{
    var urlFetchingTasks = ListUrlCollection.Select(url => 
                           {
                               var httpClient = new HttpClient();
                               return httpClient.GetAsync(url);
                           });

    await Task.WhenAll(urlFetchingTasks);
    Console.WriteLine("Done");
}