2012-10-30 52 views
3

我已经得到了下面的代码,我只需要确保这是做到这一点的正确方法。它的工作原理和一切,但没有预期的那么快。我已经定时每个单独的电话和最长的时间不是靠近运行所需时间的地方。我应该如何使用Task When All?

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();在开始时? –

+0

getproducts看起来像什么? – casperOne

回答

1

似乎getproducts返回类型分配给IList<T>。这意味着getproducts将在您从getproducts返回的每个项目上致电DoSomethingAsync之前实现结果集。

根据产生每件物品所需的时间和实现的时间长短,该集合可能具有最大的影响力。

也就是说,您应该更改getproducts方法以返回IEnumerable<T>实现。但您需要做的不仅仅是更改退货类型,您需要删除实现(更可能是致电ToList),并使用yield代替。

+0

GetProducts所做的全部工作都是到数据库并且最多可以提取5个产品,我已经看过这个和它总是非常快速的调用 – Steoates

+0

@Steoates那么'DoSomethingAsync'做了什么? – casperOne

+0

DoSomethingAsync基本上只是一个URL处理,可能需要一段时间!因此异步/等待工作尝试并加快速度 – Steoates