2013-07-26 2 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

합니까를'? .NET의 어떤 버전입니까? –

+0

안녕하십니까, 지금은 작업을 반환하지 않습니다. .NET 4.0. 호출하고있는 세 가지 메서드는 병렬로 호출되기를 원하기 때문에 B 메서드를 호출하여 메서드를 호출 할 때까지 메서드 A가 완료 될 때까지 기다리지 않습니다. – lex87

+0

항목이 지금과 같은 순서 (즉, 첫 번째부터 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를 사용하십시오`작업 을`반환 GetSomeItems`

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