我该如何使用Task.WhenAll?

3

我有以下代码,我只需要确保这是正确的做法...它可以工作,但速度不如我期望的那样快...我已经计时了每个单独的调用,最长的时间也远远没有运行所需的时间。

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

2
你确定时间不是在调用getproducts()函数时被占用了吗? - Justin Harvey
getproducts 是什么样子? - casperOne
1个回答

1

看起来getproducts返回的类型可以分配给IList<T>。这意味着在从getproducts返回的每个项目上调用DoSomethingAsync之前,getproducts会实现结果集。

根据每个项目产生所需的时间和实现集的时间长短,很可能会产生最大的影响。

话虽如此,您应该更改getproducts方法以返回IEnumerable<T>实现。但是,您需要做更多的事情,不仅需要更改返回类型,还需要删除实现(很可能是对ToList的调用),并改用yield


GetProducts所做的就是去数据库中获取最多5个产品,我已经检查过了,它总是非常快的调用。 - Steoates
@Steoates 那么 DoSomethingAsync 做什么呢? - casperOne
基本上,在里面 scrapeResult = await UrlScraper.ScrapeAsync(product.ProductUrl);model = this.ProcessCheckStock(model, scrapeResult, product); ProcessCheckStock不是异步的。 - Steoates
@Steoates,顺便说一下,您需要更新您的问题并包含所有这些信息。 - casperOne
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/18802/discussion-between-steoates-and-casperone - Steoates
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接