带参数的任务列表

Task List with parameters

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

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

我已经用谷歌搜索并搜索过这个网站,但我总是陷入死胡同,我做过一次,但不记得是怎么做的。

Task Parallel Library 公开了一种方便的方法,可以通过 Task.WhenAll 方法异步等待所有任务的完成。方法 return 是一个 Task 本身,它是可等待的,应该被等待:

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

请注意,为了 await,您的方法必须在方法签名中用 async 修饰符标记,并且 return 或者 Task(如果它有没有 return 值)或 Task<T>(如果它确实有 return 值,则类型为 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");
}