带参数的任务列表
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.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");
}
我需要创建一个任务列表来执行一个带有一个参数的例程,然后等待这些任务完成,然后再继续其余的程序代码。这是一个例子:
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.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");
}