2012-04-24 43 views
7

Làm cách nào để thực thi System.Threading.Task khi tiếp tục hai hoặc nhiều kết quả Task khác?Làm cách nào để hợp nhất hai kết quả Nhiệm vụ trong nhiệm vụ thứ ba?

public Task<FinalResult> RunStepsAsync() 
{ 
    Task<Step1Result> task1 = Task<Step1Result>.Factory.StartNew(Step1); 

    // Use the result of step 1 in steps 2A and 2B 
    Task<Step2AResult> task2A = task1.ContinueWith(t1 => Step2A(t1.Result)); 
    Task<Step2BResult> task2B = task1.ContinueWith(t1 => Step2B(t1.Result)); 

    // Now merge the results of steps 2A and 2B in step 3 
    Task<FinalResult> task3 = task2A 
     .ContinueWith(
      t2A => task2B.ContinueWith(
       t2B => Step3(t2A.Result, t2B.Result))) 
     .Unwrap(); 
    return task3; 
} 

Công trình này, nhưng double ContinueWith có vẻ không hiệu quả. Có cách nào tốt hơn để làm điều này, có lẽ với một TaskCompletionSource? (Tôi không muốn sử dụng khóa hoặc Task.WaitAll.)

Trả lời

17

Sử dụng TaskFactory.ContinueWhenAll.

class Step1Result {} 
class Step2AResult 
{ 
    public Step2AResult(Step1Result result) {} 
} 
class Step2BResult 
{ 
    public Step2BResult(Step1Result result) {} 
} 
class FinalResult 
{ 
    public FinalResult(Step2AResult step2AResult, Step2BResult step2BResult) {} 
} 

    public Task<FinalResult> RunStepsAsync() 
    { 
     var task1 = Task<Step1Result>.Factory.StartNew(() => new Step1Result()); 

     // Use the result of step 1 in steps 2A and 2B 
     var task2A = task1.ContinueWith(t1 => new Step2AResult(t1.Result)); 
     var task2B = task1.ContinueWith(t1 => new Step2BResult(t1.Result)); 

     // Now merge the results of steps 2A and 2B in step 3 
     return Task <FinalResult> 
      .Factory 
      .ContinueWhenAll(new Task[] { task2A, task2B }, tasks => new FinalResult(task2A.Result, task2B.Result)); 
    } 
+0

Điều này trông giống như những gì tôi muốn, mặc dù quá tải 'ContinueWhenAll' mà bạn liên kết không thực hiện hoặc trả về' Tác vụ '. Nếu bạn cập nhật liên kết của mình lên http://msdn.microsoft.com/en-us/library/ee362175.aspx, tôi sẽ chấp nhận câu trả lời của bạn. –

+0

Đẹp! Tôi đã bỏ lỡ ContinueWhenAll. Chúc mừng! –

Các vấn đề liên quan