我有幾個Task
的對象,如Task<int>
,Task<string>
,Task<double>
,我想依次運行。也就是說,每個任務完成後,下一個任務自動啓動。每個任務取決於先前任務的輸出。Sequence .Net任務
我該怎麼做? myTask.ContinueWith(...)重載都假定委託參數。但一個任務不是一個代表。
我有幾個Task
的對象,如Task<int>
,Task<string>
,Task<double>
,我想依次運行。也就是說,每個任務完成後,下一個任務自動啓動。每個任務取決於先前任務的輸出。Sequence .Net任務
我該怎麼做? myTask.ContinueWith(...)重載都假定委託參數。但一個任務不是一個代表。
你可以做這樣的:
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 */
我相信您的第二個示例不是必需的。如果你想得到結果,請使用第一個例子,然後等待't3'完成。完成後,您可以通過每個任務實例('t1','t2','t3')上的Task.Result'屬性分別獲取每個任務的結果。 –
@OJ,當然 - 謝謝:) – ebb
有你[續任務]走了過來此頁面(HTTP: //msdn.microsoft.com/en-us/library/ee372288.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1) – tinstaafl
使委託傳遞給myTask.ContinueWith(...)開始下一個任務。或者,在您安排線程池上的任務並且它們的有序執行至關重要的情況下,我找到了帶有maxDegreeOfParallelism =的LimitedConcurrencyLevelTaskScheduler(http://msdn.microsoft.com/zh-cn/library/ee789351.aspx) 1,有很大的幫助。 –
@KirillShlenskiy你應該做出答案。現有的答案不如您的解決方案。 – usr