处理Task中的异常

时间:2011-07-15 07:35:34

标签: c# multithreading error-handling

我想知道在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文章帮助我理解了任务。

1 个答案:

答案 0 :(得分:4)

TPL努力为您处理异常并将其移出您的任务之外。

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

通常,您确实希望处理等待点周围的异常。如果在GUI上显示消息,立即消除Dispatch问题。