如何等待所有任务包括task.factory


private async Task StartRequesting()
{
for (int i = 0; i < 50; i++)
{
await Task.Factory.StartNew(async () =>
{
string Result =  await GetAsync("www.google.com");
Console.WriteLine(Result);
});
}
}
Console.WriteLine("Starting Request");
await StartRequesting();
Console.WriteLine("Requesting has been finished");

我现在该如何等待所有任务都已完成?我试过Task.When,但结果是这样的

Starting Request
(google result)
(google result)
(google result)
Requesting has been finished
(google result)
(google result) 

注意:我不想在没有Task.Factory.StartNew的情况下使用它,因为完成所有请求需要很长时间。

我总是发现最干净的方法是通过LINQ,假设并发请求没有限制:

private async Task StartRequesting()
{
var tasks = Enumerable.Range(1, 50)
.Select(async _ =>
{
string Result = await GetAsync("www.google.com");
Console.WriteLine(Result);
});
await Task.WhenAll(tasks);
}

不会发生阻塞,也不需要手动创建任务。

将所有任务放入列表并在完成所有任务后获得结果会更容易、更干净、更高效。

private async Task StartRequesting()
{
var taskList = new List<Task<string>>();
for (var i = 0; i < 50; i++)
taskList.Add(Task.Run(async () => await GetAsync("www.google.com")));
var tWhenAll = await Task.WhenAll(taskList.ToArray());
foreach(var t in taskList)
Console.WriteLine(t.Result);
}

最新更新