使用TPL处理异常而不使用Wait()

时间:2012-01-03 15:05:03

标签: c# .net exception-handling task-parallel-library

我有一个带有“开始”和“停止”按钮的应用程序,以及按下“开始”后在后台运行的线程。我使用MVC和TPL。

如何处理TPL中的异常,因为我从不调用Wait()方法?在任何异常中,我需要显示错误消息框,并且应该在它立即被抛出后显示此框。

我总是在后台单线程,所以你不能在没有先前停止线程的情况下按下Start。

我正在寻找一些好的模式或最佳实践。我有一个想法,将try..catch放在线程内,并在每个catch上调用一个事件,但我不确定这样的方法是否是好的架构决策

3 个答案:

答案 0 :(得分:24)

如果您正在使用Tasks,则可以添加仅在抛出异常时才运行的延续。您还可以告诉它在您的UI线程上运行,以便您可以使用UI控件:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... },
    CancellationToken.None,
    TaskContinuationOptions.OnlyOnFaulted,
    TaskScheduler.FromCurrentSynchronizationContext()
);

答案 1 :(得分:3)

在高级别,Wait方法只接受后台线程中发生的Exception,将其包装在另一个Exception类型中并重新抛出它。因此,您可以使用围绕逻辑代码的标准Exception块观察后台线程上的原始try / catch

答案 2 :(得分:2)

在Task中处理异常(在后台线程上)没有任何问题。如果您需要在发生异常时显示UI,则可以使用Dispatcher(假设您使用的是wpf或silverlight):http://msdn.microsoft.com/en-us/magazine/cc163328.aspx