最好的方法是使用任务并行库(TPL)和继续。Continuation 不仅允许您创建任务流,还可以处理异常。这是TPL的很好的入门介绍。但为了给你一些概念...
您可以使用下面的方式开始一个TPL任务:
Task task = Task.Factory.StartNew(() =>
{
// Do some work here...
});
现在,要在原任务完成时(无论是成功还是错误)启动第二个任务,您可以使用ContinueWith
方法。
Task task1 = Task.Factory.StartNew(() => Console.WriteLine("Antecedant Task"));
Task task2 = task1.ContinueWith(antTask => Console.WriteLine("Continuation..."));
当task1
完成、失败或被取消时,task2
就会启动并开始运行。请注意,如果task1
在第二行代码之前已完成,则task2
将立即被调度执行。传递给第二个lambda表达式的antTask
参数是对先行任务的引用。有关更详细的示例,请参见此链接...
您还可以从先行任务中传递连续结果。
Task.Factory.StartNew<int>(() => 1)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask => antTask.Result * 4)
.ContinueWith(antTask =>Console.WriteLine(antTask.Result * 4)); // Prints 64.
注意:务必阅读第一个链接中关于异常处理的内容,因为这可能会让新手误入TPL。
特别需要注意的是,如果要实现您所需的功能,请查看子任务。子任务是通过 AttachedToParent
创建的任务。在这种情况下,延续将不会运行,直到所有子任务都已完成。
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { SomeMethod() }, atp);
Task.Factory.StartNew(() => { SomeOtherMethod() }, atp);
}).ContinueWith( cont => { Console.WriteLine("Finished!") });
希望这能帮到你。