2013-07-26 100 views
1

我有一些代碼,類似於這樣的東西:獲取項目

public IList<Result> GetResult() 
    { 
     var result = new List<Result>(); 

     result.AddRange(GetSomeItemsA()); 
     result.AddRange(GetSomeItemsB()); 
     result.AddRange(GetSomeItemsC()); 

     return result; 
    } 

我想調用的方法GetSomeItemsA,GetSomeItemsB和GetSomeItemsC使用任務並行庫或使其更快一些,然後只在三項任務完成時才返回結果。

一般來說,什麼是最佳方法,當我們需要從不同來源獲取物品然後返回包含來自這些來源的所有物品的結果時,如何進行優化?

+0

不'GetSomeItems'返回任務''?什麼版本的.NET? –

+0

嗨,不,它目前不返回任務。 .NET的4.0版本。我打電話的三種方法我想同時調用,以便我不等待方法A完成以調用方法B來獲取我的項目。 – lex87

+0

這些項目是否必須與它們現在的順序相同(即從A開始,然後從B開始,然後從C開始)? – svick

回答

0

我不喜歡的東西如下:

 var result = new List<Result>(); 

     var firstTask = new Task<IEnumerable<Result>>(this.GetSomeItemsA); 
     var secondTask = new Task<IEnumerable<Result>>(this.GetSomeItemsB); 
     var thirdTask = new Task<IEnumerable<Result>>(this.GetSomeItemsC); 
     firstTask.Start(); 
     secondTask.Start(); 
     thirdTask.Start(); 

     Task.WaitAll(firstTask, secondTask, thirdTask); 

     result.AddRange(firstTask.Result); 
     result.AddRange(secondTask.Result); 
     result.AddRange(thirdTask.Result); 

     return result; 
+0

除了首先創建'Task'和'Start()'外,你可以調用'Task.Factory.StartNew()'。 – svick

1

您可以使用PLINQ做到這一點:

public IList<Result> GetResult() 
{ 
    return new Func<IEnumerable<Result>>[] { GetSomeItemsA, GetSomeItemsB, GetSomeItemsC } 
     .AsParallel() 
     .SelectMany(f => f()) 
     .ToList(); 
}