gpt4 book ai didi

c# - WhenAny vs WhenAll vs WaitAll vs none,考虑到结果正在被立即使用

转载 作者:行者123 更新时间:2023-12-03 15:17:23 37 4
gpt4 key购买 nike

我必须在多个异步任务完成后立即使用它们的输出。

这些方法中的任何一种都会有合理的性能差异吗?

简单的等待

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;
}

什么时候全部
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;
}

等待全部
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;
}

任何时候
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 v WhenAny 中是否存在内部开销差异?

    WhenAll 在所有任务完成后返回控制权,而 WhenAny 在单个任务完成后立即返回控制权。后者似乎需要更多的内部管理。

    最佳答案

    简单的 await 将一个接一个地执行每个项目,基本上是同步的 - 这将是最慢的。
    WhenAll 将等待所有任务完成 - 运行时将是最长的单个任务。

    不要使用 WaitAll - 它是同步的,只需使用 WhenAllWhenAny 允许您在每个任务完成时处理它。在某些情况下,这将比 WhenAll 更快,具体取决于您在任务后必须执行的处理量。

    IMO,除非您需要在每个任务完成后立即开始后期处理,否则 WhenAll 是最简单/最干净的方法,并且在大多数情况下都可以正常工作。

    关于c# - WhenAny vs WhenAll vs WaitAll vs none,考虑到结果正在被立即使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60659896/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com