c# - 使用异步编程捕获异常

标签 c# asynchronous

对比 C# 2005

我正在使用下面的代码通过网络客户端异步上传文件。但是,如果出现问题,我不确定是否可以捕获异常。因为 wc.UpLoadFileAsync 会立即返回。因此,将 try...catch 放在那里似乎毫无意义。

所以为了测试,我故意创建了一个错误,看看如果我输入了错误的 URL 会发生什么。但是,我在调试输出窗口中得到了这个。

A first chance exception of type 'System.Net.WebException' occurred in System.dll
File completed

所以它不会在 try...catch 中触发。它仍然触发 UploadFileCompleted 方法

private void upload_config_to_server()
{
    Uri url = new Uri("http://10.10.10.3/softphone/config.xml");

    WebClient wc = new WebClient();
    if (!wc.IsBusy)
    {
        wc.UploadProgressChanged += new UploadProgressChangedEventHandler(wc_UploadProgressChanged);
        wc.UploadFileCompleted += new UploadFileCompletedEventHandler(wc_UploadFileCompleted);      

        try
        {
            wc.UploadFileAsync(url, "PUT", "config.xml");
        }
        catch (WebException webex)
        {
            Console.WriteLine("Web Exception {0}", webex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception {0}", ex.Message);
        }
    }
}

private void wc_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
    Console.WriteLine("Bytes uploaded {0}", e.BytesSent);
}

private void wc_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
    Console.WriteLine("File completed");
}  

有没有正确的方法来处理这个问题。我只想向用户显示一个消息框,以显示上传文件失败的原因。但是,由于上传的文件可能很大,上传它可能需要几秒钟的时间。所以我需要异步来防止 UI 卡住。

非常感谢您的任何建议,

最佳答案

可以查看e.Error值。

private void wc_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
    if (e.Error != null)
    {
        if (e.Error is WebException)
            Console.WriteLine("Web Exception {0}", ((WebException)e.Error).Message);
        else
            Console.WriteLine("Web Exception {0}", e.Error.Message);
    }
    else if (e.Cancelled)
        Console.WriteLine("File cancelled");
    else
        Console.WriteLine("File completed");
} 

关于c# - 使用异步编程捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164243/

相关文章:

.net - 基于 TcpListener 的应用程序不能很好地扩展

javascript - Node 光纤是否阻塞?

c# - .net framework 4 中的 nameof 表达式

java - WinForms 中有哪些轻量级/重量级组件?

c# - Json 无法解析 ajax post 请求

javascript - 从数组构造生成器函数

c# - 任务状态 :Waiting for activation -DownloadStringTaskAsync -WP8

c# - 什么时候值类型/引用类型约束在 C# 中有用?

c# - 操作数类型冲突 : varchar is incompatible

javascript - 如何从异步调用返回响应?