【问题标题】:Handling exceptions inside Task处理Task内部的异常
【发布时间】:2011-07-15 07:35:33
【问题描述】:

我想知道在 wpf 应用程序中编写这种代码是否是正常的做法,以便我可以捕获异常并在 UI 上显示一些消息:

Task.Factory.StartNew(() =>{                                              
    try
    {
        if (AuthenticationManager.Instance.Authenticate(username, password))
        {
            ... 
        }
        else
        {
            throw new AuthenticationException("Failed");
        }
    }
    catch (Exception ex)
    {
        Dispatcher.Invoke((Action)(() => txtWarning.Text = ex.Message));
    }
});

因此,此代码将在 UI 线程上显示错误消息。如果这是“OK”那么为什么每个人都建议使用t.Wait();然后捕获任务中出现的所有异常?
PS,可能问题很愚蠢,但我没有找到适当的解释,并且对使用任务很陌生。

更新
This Joe Albahari's 文章帮助我理解了任务。

【问题讨论】:

    标签: c# multithreading error-handling


    【解决方案1】:

    TPL 努力为您处理异常并将它们移到您的任务之外。

    因此,虽然您可以在任务本身中捕获它们,但这应该是规则的例外。

    一般来说,您确实希望处理等待点周围的异常。在 GUI 上显示消息的情况下,立即消除了 Dispatch 问题。

    【讨论】:

    • 但是如果我使用 Wait 并不意味着 UI 将冻结(例如我有一些后台工作的 UI),等待 bw 完成,处理 bw 的异常,然后才继续..?这似乎打破了我期望从另一个线程获得的所有异步工作。我想我弄错了,但这就是我理解等待方法的方式:(
    • @0x49D1: 但是如果你已经在其他线程中遇到了异常,那么这个线程,即使还没有被互操作,顺便说一下已经处于非“有效状态”,所以你必须中断它的执行,不是吗?
    • @Tigran,是的,我会打破/取消它..我不能吗?!
    • 中止线程并不是一个好习惯,如果它有异常,它会自行消失(至少应该:))
    • Ok :),但我已经询问过如何处理线程内的线程异常并将它们异步登录/传递给 UI。我发布的解决方案有效(认为它工作正常),所以我问为什么msdn建议使用Wait“触发”异常,但Wait让UI实际上等待其他线程完成(虽然我已经说过,我可能会弄错) ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多