C# 处理任务内部的异常

C# 处理任务内部的异常,c#,multithreading,error-handling,C#,Multithreading,Error Handling,我想知道在wpf应用程序中编写此类代码是否是正常的做法,以便捕获异常并在UI上显示一些消息: Task.Factory.StartNew(() =>{ try { if (AuthenticationManager.Instance.Authenticate(username, password)) { ...

我想知道在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,也许这个问题很傻,但我并没有找到合适的解释,而且我对任务的使用还不熟悉

更新

这篇文章帮助我理解了任务

TPL会尽力为您处理异常,并将其转移到您的任务之外

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


通常,您确实希望处理等待点周围的异常。在GUI上显示消息的情况下,可以立即消除分派问题

但是,如果我使用Wait,这不意味着UI将冻结(例如,我有一个带有一些后台工作的UI),等待bw完成,处理bw的异常,然后仅在此之后继续。。?这似乎破坏了我从另一个线程期望的所有异步工作。我想我弄错了,但这就是我理解Wait方法的方式:(@0x49D1:但是如果您在其他线程中已经出现异常,那么这个线程,即使尚未互操作,顺便说一下,也已经处于非“有效状态”,所以你必须中断它的执行,不是吗?@Tigran,是的,我会中断/取消它..不行吗?!中止线程并不是一个好的做法,如果它有异常,它会自动消失(至少应该是:))好的:),但我问过如何在线程内处理线程异常,并异步记录/传递给UI。我发布的解决方案很有效(我认为它很好),所以我问为什么msdn建议使用Wait“触发”异常,因为Wait让UI实际上等待其他线程完成(虽然我已经说过,我可能错了)。。