当Task中的exception属性可以有值时?

时间:2018-07-31 07:51:23

标签: c# task continuewith

我想知道“ continueWhith”何时有例外。

我做了这样的代码。

Task.Factory.StartNew(() =>
{
   if(HasException())
       throw new Exception("Exception");
   // Logic
}).ContinueWith(x =>
{
   // Do something to UI.
}, CancellationToken.None, TaskContinuationOptions.NotOnFaulted, 
_uiScheduler).continueWith(x =>
{
   if (x.Exception.IsNotNull()) // Exception handling here.
     ShowExceptionMessage(x.Exception);            
}

我希望最后一次continueWith任务中有异常,但不是。

在最后的continueWith任务中没有异常是对的吗?

我想知道如何在continueWith中设置异常属性。

谢谢。

1 个答案:

答案 0 :(得分:4)

  

在最后的continueWith任务中没有异常是对的吗?

是的,因为它是您的“对UI进行操作”任务的延续。如果第二个任务失败,x.Exception中只会有一个例外。

实际上,我不希望您达到 的任何一个延续,因为您的第一个任务总是出错,并且第一个延续明确表示仅在 not 时才执行有毛病。

替代品:

  • 通过第二个任务的结果传播异常(如果有)
  • 将两个延续都添加到原始任务中,而不是链接它们。 (这可能就是您最初打算的目的,是为了将有故障和无故障的路径分开。在这种情况下,请将两个延续都附加到第一个任务上,并使用TaskContinuationOptions.OnlyOnFaulted进行第二个延续-那么您就不必完全需要例外检查。)
  • 在原始任务中保留一个局部变量,以便您可以从第二个延续中获得该变量

理想情况下,我建议使用async / await,而不要使用所有继续传递的内容。它往往使事情变得简单得多。