【发布时间】:2019-02-07 22:37:18
【问题描述】:
假设我启动了 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;
}
这将始终打印“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"
(不必担心这样做的实际原因,将其视为一个有趣的问题)
【问题讨论】:
-
这看起来很像Starting Multiple Async Tasks and Process Them As They Complete (C#),但这个问题是一团糟。答案可能会有所帮助:)。
标签: c# asynchronous