【问题标题】:when the exception property in the Task can have a value?Task中的异常属性什么时候可以有值?
【发布时间】:2018-07-31 07:51:22
【问题描述】:

我想知道“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的Task中没有Exception是对的吗?

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

谢谢。

【问题讨论】:

  • async await 胜利

标签: c# task continuewith


【解决方案1】:

最后continueWith的Task中没有Exception是对的吗?

是的,因为它是“对 UI 做一些事情”任务的延续。如果第二个任务失败,x.Exception 中只会出现异常。

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

替代方案:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多