2013-06-01 41 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