【问题标题】:How should I use Task When All?我应该如何使用 Task When All?
【发布时间】:2025-12-20 02:15:14
【问题描述】:

我有以下代码,我只需要确保这是执行此操作的正确方法。它可以正常工作,但没有 Id 期望的那么快。我已经为每个单独的呼叫计时了最长的时间远不及运行所需的时间。

public async Task<Result[]> DoSomethingGoodAsync()
{
    List<Product> productList = getproducts();

    IEnumerable<Task<Result>> list = 
        from p in productList select DoSomethingAsync(p);

    Task<Result>[] slist = list.ToArray();

    return await Task.WhenAll(slist);
}

现在我的问题又来了,这是正确的吗?有没有更好更有效的方法来做到这一点? DoSomethingAsync 是一个可等待的方法,它也调用另一个异步方法。

编辑:我的问题..这是建立我想一起执行的等待方法集合的正确方法吗?

DoSomethingAysnc() 内部

   scrapeResult = await UrlScraper.ScrapeAsync(product.ProductUrl);

   model = this.ProcessCheckStock(model, scrapeResult, product);

【问题讨论】:

  • 你确定调用getproducts()没有占用时间吗?一开始?
  • getproducts 长什么样子?

标签: c# task-parallel-library async-await


【解决方案1】:

似乎getproducts 返回了一个可分配给IList&lt;T&gt; 的类型。这意味着getproducts 在您对从getproducts 返回的每个项目调用DoSomethingAsync 之前实现结果集。

根据产出每个项目和实现该系列所需的时间,很可能会产生最大的影响。

也就是说,您应该更改 getproducts 方法以返回 IEnumerable&lt;T&gt; 实现。但是您需要做的不仅仅是更改返回类型,还需要删除具体化(很可能是调用ToList)并改用yield

【讨论】:

  • GetProducts 所做的只是去数据库并获取最多 5 个产品,我已经看过这个,它总是一个非常快速的调用
  • @Steoates 那么DoSomethingAsync 是做什么的呢?
  • DoSomethingAsync 基本上只是一个 url 抓取,它会进行一些处理,这可能需要一段时间!因此,我完成了异步/等待工作以尝试加快速度
  • @Steoates 根据您在DoSomethingAsync 中使用async/await 的方式,它很可能会产生影响。使用async 并不意味着您会自动转到另一个线程。你能发布DoSomethingAsync的完整代码吗?
  • 里面基本就是scrapeResult = await UrlScraper.ScrapeAsync(product.ProductUrl); model = this.ProcessCheckStock(model, scrapeResult, product); ProcessCheckStock 不是异步/等待