ContinueWith与一个任务中的顺序执行

时间:2014-03-23 18:25:37

标签: c# .net task-parallel-library

我刚开始熟悉任务并行库并且有一个相当简单的问题,我无法找到明确的答案。

下列代码段之间是否有任何区别?我应该选择其中一个代码段?

Task t = Task.Factory.StartNew(() => {
    Result result = Utils.Calculate();
    Utils.ProcessResults(result);
});  

Task<Result> t = Task<Result>.Factory.StartNew(() =>  Utils.Calculate());
t.ContinueWith((x) =>  Utils.ProcessResults(x));

似乎第一种方法是可行的,因为它的开销较少,实际上使用ContinueWith在这个简单的例子中没有多大意义。 但话说回来,我已经看到第二种方法在某些情况下被用于可以与第一种方式互换的......

2 个答案:

答案 0 :(得分:4)

使用延续模型,您可以在原始任务完成时调度异步处理的延续。这意味着一个线程可能会获取原始任务,处理它,获取其他一些工作,处理它,并且只在稍后的某个时刻获取处理的延续。

如果没有延续,您可以保证处理线程在任务完成之前执行两个语句。

我承认我对这些场景的经验有限,但有几个原因让人想到使用延续:

  • 您需要安排在继续之前(可能)处理的其他工作。
  • 您想要一种方法来提醒主叫线程第一个语句已完成(即更新某些UI),但并不关心第二个已完成。

答案 1 :(得分:-1)

如果您在继续执行程序逻辑之前执行必须完成的异步操作,则最好使用

ContinueWith()。例如,如果您要从数据库中检索某些内容,则可以将其放入任务中,这样您就不会冻结UI。您不能继续使用下一个语句,因为异步操作可能尚未完成,因此您将下一个语句放在ContinueWith()中。异步操作完成后,将执行下一个语句。

在您的情况下,如果Utils.Calculate()是同步的,请转到第一种方法。如果它是异步的,请转到第二个。