我需要创建一个任务列表来执行一个带有一个参数的例程,然后在继续执行其余的程序代码之前等待这些任务完成。这是一个例子:
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搜索并搜索了这个网站,但我只是一直走到了尽头,我曾经做过一次,但不记得如何。
答案 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.StartNew
或Task.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");
}