2013-07-26 74 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(); 
}