2012-04-24 15 views
7

मैं दो या अधिक अन्य कार्य परिणामों की निरंतरता के रूप में एक सिस्टम को कैसे कार्यान्वित कर सकता हूं। थ्रेडिंग। कार्य?किसी तीसरे कार्य में दो कार्य परिणामों को कैसे मर्ज करें?

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; 
} 

यह काम करता है, लेकिन डबल जारी रखें अक्षम लगता है। क्या ऐसा करने का कोई बेहतर तरीका है, शायद टास्क कॉम्प्लिशन स्रोत के साथ? (मैं ताले या कार्य का उपयोग नहीं करना चाहता हूं। प्रतीक्षा करें।)

उत्तर

17

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

ऐसा लगता है कि मैं क्या चाहता हूं, हालांकि 'जारी रखें' ओवरलोड जो आप लिंक करते हैं वह 'कार्य ' नहीं लेता है या वापस नहीं करता है। यदि आप http://msdn.microsoft.com/en-us/library/ee362175.aspx पर अपना लिंक अपडेट करते हैं, तो मैं आपका उत्तर स्वीकार करूंगा। –

+0

सुंदर! मैं जारी रहूँगा सभी। चीयर्स! –

संबंधित मुद्दे