最好的方法是使用Task Parallel Library (TPL)和Continuations。延续不仅允许您创建任务流,还可以处理您的异常。这是 TPL 的great introduction。但是给你一些想法......
您可以使用
启动 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 'fires-up' 并开始运行。请注意,如果task1 在到达第二行代码之前完成,task2 将被安排立即执行。传递给第二个 lambda 的 antTask 参数是对前面任务的引用。有关更多详细示例,请参阅this link...
您还可以传递先前任务的延续结果
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!") });
我希望这会有所帮助。