【问题标题】:Sequential method calls within a single Task vs ContinueWith for each method call单个任务中的顺序方法调用与每个方法调用的 ContinueWith
【发布时间】:2013-12-13 05:12:25
【问题描述】:

前几天我遇到了这个sn-p代码:

Task.Factory.StartNew(() =>
{
    d1();
}).ContinueWith((_) =>
{
    d2();
}).ContinueWith((_) =>
{
    d3();
});

有什么原因我不能将其重构为以下内容吗?

Task.Factory.StartNew(() =>
{
    d1();
    d2();
    d3();
});

【问题讨论】:

  • 你的问题是什么?
  • 阅读stackoverflow.com/help/dont-ask你的问题只是变相的咆哮:“______糟透了,对吗?”
  • 问题:“为什么不只是”,对我来说似乎很清楚。
  • 问题是,这是一个有效的问题,只是措辞如此糟糕和咆哮,以至于没有人会认真对待它。
  • 总是有@Servy。

标签: c# task-parallel-library


【解决方案1】:

好吧,即使作者打算这样做,它们的行为也不相同。

假设d1 是这样实现的:

public static void d1(){throw new Exception();}

在第一个代码中,sn-p d2d3 都运行(因为默认情况下,即使任务是错误的延续,延续也会执行;当然,它们可以配置为以其他方式执行) .在第二种情况下,它们不会,因为第一个方法调用中的异常会传播出去,跳过其他两个方法的执行。

因此,只要您看到第一个代码,就不能立即将其重构为第二个。 (但是你可能会问自己是否应该这样做;作者可能打算拥有第二个的语义,即使他们写了第一个。)

【讨论】:

  • 谢谢,你让我了解更多。我想很多人都不知道。我的问题对你有好处吗?
  • @awint23,别介意哥们!但是这是一个QnA站点,需要从自己的站点学习这些代码,比如msdn.microsoft.com
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多