对于每个方法调用,顺序方法在单个Task vs ContinueWith内调用

时间:2013-12-12 17:12:21

标签: c# task-parallel-library

前几天我遇到了这段代码:

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

我有什么理由不能将其重构到下面吗?

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

1 个答案:

答案 0 :(得分:7)

嗯,即使作者打算这样做,他们的行为也不一样。

我们假设d1的实现方式如下:

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

在第一个代码片段d2d3中都运行(因为默认情况下,即使任务是连续的故障,它们也会执行;它们可以被配置为以其他方式执行课程)。在第二个中,它们不会,因为第一个方法调用中的异常传播出去,跳过了其他两个方法的执行。

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