【问题标题】:Handling exception with TPL without Wait()使用没有 Wait() 的 TPL 处理异常
【发布时间】:2012-02-01 14:36:46
【问题描述】:

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

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

我在后台总是有一个线程,所以你不能在没有事先停止线程的情况下按开始。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您使用Tasks,您可以添加一个仅在引发异常时运行的延续。你也可以让它在你的 UI 线程上运行,这样你就可以使用你的 UI 控件了:

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

        【讨论】:

        • 这是一个非常好的功能!谢谢
        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多