如何为正在进行异步WebClient调用的winforms应用程序创建全局异常处理程序

本文关键字:应用程序 winforms 创建 全局 异常处理程序 调用 正在进行 异步 WebClient | 更新日期: 2023-09-27 18:19:37

我有一个winforms应用程序,它通过如下回调过程进行异步WebClient调用。。。

using (var wc = new WebClient())
{
    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
    wc.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(DownloadProgressCallback);
    //other stuff
    wc.DownloadFileAsync(uri, fullLocalPath);
}

我想创建一个全局异常处理程序,所以我已经为它定义了一个应用程序事件…

[STAThread]
static void Main()
{
    Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
    //other stuff
    Application.Exit();
}
private static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Do logging or whatever here
    Application.Exit();
}

回调事件引发的应用程序错误不会被application.ThreadException捕获,我相信我是正确的?那么,确保回调异常得到处理的最佳方法是什么呢?

我在其他SO帖子中看到,你也可以为AppDomain.CurrentDomain.UnhandledException创建一个处理程序。这是处理回调异常的最佳方式吗?

我只是在寻找在winforms应用程序中使用异步回调的最佳实践。

编辑

尼古拉斯。。。谢谢你的回答。所以我可以把整个回调放在一个尝试接球中,然后在接球中投球。或者,我是否必须显式检查AsyncCompletedEventArgs.error属性中的非null值。

如果它不是空的。。。你能告诉我如何使回调错误出现在我的全局异常处理程序中吗?

我想我会这样做。。。

private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error != null)
    {
        throw e.Error;
    }
    if (DownloadHasCompleted == null) return;
    File.Copy(this.RemoteIniFilePath, this.CurrentIniFilePath, true);
    DownloadHasCompleted(this, e);
}

Seth

如何为正在进行异步WebClient调用的winforms应用程序创建全局异常处理程序

任何异常都将传递给DownloadFileCompleted事件处理程序。

这是使用具有Error属性的AsyncCompletedEventArgs对象调用的。

您只需要在处理程序中检查此属性,它不会是"未处理的异常"。

是的,AppDomain.CurrentDomain.UnhandledException是处理任何未以其他方式处理的异常的方法。

然而,通常情况下,您应该在我称之为最外层的边缘中有异常处理程序,特别是:控制事件、回调等。