Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为正在进行异步WebClient调用的winforms应用程序创建全局异常处理程序_C#_.net_Winforms_Exception Handling_Callback - Fatal编程技术网

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

C# 如何为正在进行异步WebClient调用的winforms应用程序创建全局异常处理程序,c#,.net,winforms,exception-handling,callback,C#,.net,Winforms,Exception Handling,Callback,我有一个winforms应用程序正在进行异步WebClient调用,其回调过程如下 using (var wc = new WebClient()) { wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted); wc.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(DownloadProgressCa

我有一个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();
}
我认为回调事件引发的应用程序错误不会被应用程序捕获是正确的。ThreadException?那么,确保回调异常得到处理的最佳方法是什么

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

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

编辑

尼古拉斯…谢谢你的回答。因此,我可以将整个回调放入一个try-catch,然后在catch中进行一次抛出。或者我必须显式检查AsyncCompletedEventArgs.error属性中的非空值

如果它是非空的…您能告诉我如何使回调错误冒泡到我的全局异常处理程序吗

我想我会这样做

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

任何异常都将传递给您的
下载文件完成
事件处理程序

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


您只需在处理程序中检查此属性-它不会是“未处理的异常”。

是的,AppDomain.CurrentDomain.UnhandledException是处理任何未经处理的异常的方法


但是,一般来说,在我称之为最外边缘的地方应该有异常处理程序,特别是:控制事件、回调等。

Nicholas…只需检查该属性是否为非null?或者我可以将整个回调放入try-catch,然后抛出一次吗?是的,只需检查属性并按照您的意愿处理它。该事件在UI线程上引发,因此您可以更新UI控件。作为一种风格,我会在
DownloadCompleted
中处理该异常,但如果您希望在全局异常处理程序中捕获该异常,那么是的,应该可以。