2012-10-30 51 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