前几天我遇到了这段代码:
Task.Factory.StartNew(() =>
{
d1();
}).ContinueWith((_) =>
{
d2();
}).ContinueWith((_) =>
{
d3();
});
我有什么理由不能将其重构到下面吗?
Task.Factory.StartNew(() =>
{
d1();
d2();
d3();
});
答案 0 :(得分:7)
嗯,即使作者打算这样做,他们的行为也不一样。
我们假设d1
的实现方式如下:
public static void d1(){throw new Exception();}
在第一个代码片段d2
和d3
中都运行(因为默认情况下,即使任务是连续的故障,它们也会执行;它们可以被配置为以其他方式执行课程)。在第二个中,它们不会,因为第一个方法调用中的异常传播出去,跳过了其他两个方法的执行。
因此,只要您看到第一个代码,就无法立即将其重构为第二个代码。 (但是你可能会问自己是否应该这样;作者可能会想要第二个语义,即使他们写的是第一个语法。)