在多个异步任务完成后,我必须立即消耗它们的输出。
在这些方法中,是否存在合理的性能差异?
简单等待
public async Task<List<Baz>> MyFunctionAsync(List<Foo> FooList) {
results = new List<Baz>();
List<Task<List<Baz>>> tasks = new List<Task<List<Baz>>>();
foreach (Foo foo in FooList) {
tasks.Add(FetchBazListFromFoo(entry));
foreach (Task<List<Baz>> task in tasks) {
results.AddRange(await task);
return results;
}
WhenAll
public async Task<List<Baz>> MyFunctionAsync(List<Foo> FooList) {
results = new List<Baz>();
List<Task<List<Baz>>> tasks = new List<Task<List<Baz>>>();
foreach (Foo foo in FooList) {
tasks.Add(FetchBazListFromFoo(entry));
foreach (List<Baz> bazList in await Task.WhenAll(tasks))
results.AddRange(bazList);
return results;
}
WaitAll
public async Task<List<Baz>> MyFunctionAsync(List<Foo> FooList) {
results = new List<Baz>();
List<Task<List<Baz>>> tasks = new List<Task<List<Baz>>>();
foreach (Foo foo in FooList) {
tasks.Add(FetchBazListFromFoo(entry));
foreach (List<Baz> bazList in await Task.WaitAll(tasks))
results.AddRange(bazList);
return results;
}
WhenAny
public async Task<List<Baz>> MyFunctionAsync(List<Foo> FooList) {
results = new List<Baz>();
List<Task<List<Baz>>> tasks = new List<Task<List<Baz>>>();
foreach (Foo foo in FooList) {
tasks.Add(FetchBazListFromFoo(entry));
while (tasks.Count > 0) {
Task<List<Baz>> finished = Task.WhenAny(tasks);
results.AddRange(await finished);
tasks.Remove(finished);
}
return results;
}
FooList
有约100个条目。FetchBazListFromFoo
对大约30个REST API进行调用,并对每个REST API调用的结果进行一些同步工作。
另外,WhenAll和WhenAny之间是否存在内部开销差异?
当所有任务完成后,WhenAll返回控制权,而当任意一个任务完成时,WhenAny返回控制权。后者似乎需要更多的内部管理。
new Task
创建的,但这并不是创建任务的推荐方式)。Await、WhenAll和WhenAny只是等待一个或多个任务完成。 - ckuriawait
、Task.WhenAll
和Task.WhenAny
本身。这些方法包括创建(可能是热的)任务,正如你可以看到嵌入在问题代码中的那样。 - Theodor ZouliasTask.WhenAny
方法。它对应于问题正文中的第四种方法,标题为WhenAny(以粗体显示)。 - undefined