假设我启动 5 个异步任务,并且我想按照请求的顺序打印结果:
public async void RunTasks()
{
var tasks = new List<Task<int>>();
for(int i=1; i<=5; i++)
{
tasks.Add(DoSomething(i));
}
var results = await Task.WhenAll(tasks);
Console.WriteLine(String.Join(',', results));
}
public async Task<int> DoSomething(int taskNumber)
{
var random = new Random();
await Task.Delay(random.Next(5000));
return taskNumber;
}
Run Code Online (Sandbox Code Playgroud)
这将始终打印“1,2,3,4,5” - 因为 Task.WhenAll() 按请求的顺序对结果进行排序,而不是按完成的顺序。
不幸的是,这意味着我必须等待所有任务完成才能打印任何内容。
我怎样才能在每个任务完成后立即打印结果,但仍然尊重它们所请求的顺序?
所以我应该总是看到“1,2,3,4,5” - 但它可能会逐渐到达:
"1"
"1,2,3"
"1,2,3,4"
"1,2,3,4,5"
Run Code Online (Sandbox Code Playgroud)
(无需担心这样做的实际原因,将其视为一个有趣的问题)
var tasks = new List<Task<int>>();
for(int i=1; i<=5; i++)
{
tasks.Add(DoSomething(i));
}
foreach (var task in tasks)
{
var result = await task;
Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)
我们首先启动所有任务,然后按顺序循环执行它们,依次等待每个任务。如果正在等待的任务先前已完成,则等待仅返回其结果。否则我们会等到它完成。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |