在一个任务中,使用ContinueWith和顺序执行有什么区别?

3

我刚开始熟悉任务并行库,有一个相对琐碎的问题,但我找不到清晰的答案。

以下代码片段有什么区别?在何时应该选择其中之一?

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个回答

4
使用续体模型,当原始任务完成时,您可以将其继续安排为异步处理。这意味着一个线程可能会挑选您的原始任务,处理它,接着处理其他一些工作,并在以后的某个时间再处理您的续体。
如果没有续体,您可以保证处理线程会在任务完成前执行两个语句。
我承认我对这些场景的经验有限,但有几个使用续体的原因:
  • 您正在安排其他工作,希望在续体之前(可能)处理它。
  • 您想要一种方法来提醒调用线程第一个语句已经完成了(即更新某些UI),但并不太关心第二个语句是否已经完成。

谢谢,这解释得非常清楚。 - orom

-1

ContinueWith() 最好用于异步操作必须在程序逻辑继续之前完成的情况下。例如,如果您正在从数据库检索某些内容,则可以将其放入任务中,以便不会冻结用户界面。您不能只是继续执行下一条语句,因为异步操作可能尚未完成,因此您需要将下一条语句放在 ContinueWith() 中。当异步操作完成时,将执行下一条语句。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接