2013-06-01 44 views
1

我有幾個Task的對象,如Task<int>,Task<string>,Task<double>,我想依次運行。也就是說,每個任務完成後,下一個任務自動啓動。每個任務取決於先前任務的輸出。Sequence .Net任務

我該怎麼做? myTask.ContinueWith(...)重載都假定委託參數。但一個任務不是一個代表。

+0

有你[續任務]走了過來此頁面(HTTP: //msdn.microsoft.com/en-us/library/ee372288.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1) – tinstaafl

+1

使委託傳遞給myTask.ContinueWith(...)開始下一個任務。或者,在您安排線程池上的任務並且它們的有序執行至關重要的情況下,我找到了帶有maxDegreeOfParallelism =的LimitedConcurrencyLevelTask​​Scheduler(http://msdn.microsoft.com/zh-cn/library/ee789351.aspx) 1,有很大的幫助。 –

+0

@KirillShlenskiy你應該做出答案。現有的答案不如您的解決方案。 – usr

回答

3

你可以做這樣的:

var t1 = new Task(() => Console.WriteLine("Completed t1")); 
var t2 = new Task(() => Console.WriteLine("Completed t2")); 
var t3 = new Task(() => Console.WriteLine("Completed t3")); 

t1.ContinueWith(t => t2.RunSynchronously()) 
    .ContinueWith(t => t3.RunSynchronously()); 

t1.Start(); 


上面的示例僅適用,如果你不關心的任務的結果。不過,若你(因爲你的編輯狀態),需要每個任務的結果傳遞到下一個任務,那麼你可以這樣做:

var t1 = new Task(() => Console.WriteLine("Completed t1")); 
var t2 = new Task(() => Console.WriteLine("Completed t2")); 
var t3 = new Task(() => Console.WriteLine("Completed t3")); 

t1.ContinueWith(task1 => 
{ 
    Console.WriteLine(task1.Result); 

    t2.ContinueWith(task2 => 
    { 
     Console.WriteLine("{0} | {1}", task1.Result, task2.Result); 

     t3.ContinueWith(task3 => 
     { 
      Console.WriteLine("{0} | {1} | {2}", 
       task1.Result, task2.Result, task3.Result); 
     }); 

     t3.Start(); 
    }); 

    t2.Start(); 
}); 

t1.Start(); 

/* OUTPUT: 
Completed t1 
Completed t1 | Completed t2 
Completed t1 | Completed t2 | Completed t3 */ 
+1

我相信您的第二個示例不是必需的。如果你想得到結果,請使用第一個例子,然後等待't3'完成。完成後,您可以通過每個任務實例('t1','t2','t3')上的Task.Result'屬性分別獲取每個任務的結果。 –

+0

@OJ,當然 - 謝謝:) – ebb