2012-05-22 19 views
1

我通過LINQ查詢,像這樣像這樣有一個訂單。據我觀察,上面的代碼稱爲方法sequentally(一個電話必須完成之前,下一個被稱爲,所以如果列表很長,排序會很慢。我可以並行執行異步調用的Linq OrderBy嗎?</p> <pre><code>var sortedList = unsortedList .OrderBy(foo => foo.GetCurrentValue()) </code></pre> <p>然而,該方法GetCurrentValue響應速度很慢(因爲它涉及網絡通信,並具有相當的等待時間):

有沒有辦法告訴linq做並行?即異步計算表達式,然後每個人都完成後比較結果?

如果沒有,任何想法如何讓我們自己實現乾淨,容易嗎?

+1

在PLINQ'(進行AsParallel)的調用來''OrderBy'查詢將自動把查詢作爲'AsOrdered' - http://msdn.microsoft.com/en-us/library/dd460677.aspx我不確定這對性能有什麼影響,但MSDN文章並不清楚。 – Snixtor

+0

@Snixtor這是一個非常有用的鏈接,可能它會解決我的問題(現在測試)!爲什麼不把它作爲答案發布? –

回答

2

的MSDN有一篇文章專門在PLINQ - http://msdn.microsoft.com/en-us/library/dd460677.aspx(根據我之前的評論)中的「訂單保存」。鏈接給出的示例:

var cityQuery = (from city in cities.AsParallel() 
       where city.Population > 10000 
       select city); 

只是拋出它作爲一個可能的實現,像這樣?其中slowList是您的「慢」對象的可枚舉集合。 Parallel.ForEach可以用任何其他異步「分段」操作來取代慢速值。

var stage1List = new List<dynamic>(); 
    var parOpt = new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = 30 }; 

    System.Threading.Tasks.Parallel.ForEach(slowList, parOpt, slowObj => 
    { 
     stage1List.Add(new { Obj = slowObj, Value = slowObj.GetSlowValue() }); 
    }); 

    var stage2List = stage1List.OrderBy(p => p.Value).Select(p => p.Obj); 
+0

爲什麼當'unsortedList.AsParallel()。OrderBy(foo => foo.GetSlowValue())'似乎工作時,需要這樣的實現? –

+0

我不認爲有一種方法可以指定'AsParallel'上的並行級別?這就是說,一個'Parallel.ForEach',儘管允許指定MaxDegreeOfParallelism並不一定能夠達到最大程度的平行。我的思路是,由於本地處理能力限制以外的原因,GetSlowValue()調用可能會很慢,因此一次執行30個項目的方法可能會產生更好的性能?從本質上講,這是平行性的常見問題 - 多少? – Snixtor

+0

速度慢的原因是網絡延遲,而不是處理能力,所以如果將它們並行化,速度會變得更快。從理論上講,我認爲更多的並行性意味着更好的表現。 任何想法,如果我只指定AsParallel,他們使用什麼級別的並行性? –

相關問題

 相關問題