3

我创建了一个简单的异步操作,当单击按钮时它会被踢掉。这是整个代码:

public partial class MainWindow : Window {

    public MainWindow() {
        InitializeComponent();
    }

    private async void Button_Click_1(object sender, RoutedEventArgs e) {

        var htmlString = await DowloadPage("http://example.com");
        txtBlock1.Text = htmlString;
    }

    public async Task<string> DowloadPage(string uri) {

        using (WebClient client = new WebClient()) {

            var htmlString = await client.DownloadStringTaskAsync(uri);
            return htmlString;   
        }
    }

}

好简单。但是当我单击按钮时,我会在 UI 线程上遇到无响应的情况。当我在下载页面时尝试在窗口中移动时,我无法做到。

知道出了什么问题吗?

编辑:

我在 .NET 4.5 中使用 HttpClient 进行了尝试,结果与预期的一样好:

public async Task<string> DowloadPage(string uri) {

    using (HttpClient client = new HttpClient()) {

        var response = await client.GetAsync(uri);
        var htmlString = await response.Content.ReadAsStringAsync();
        return htmlString;   
    }
}
4

1 回答 1

5

WebClientuses HttpWebRequest,不幸的是,即使您使用“异步”方法,它也不是很异步。它至少会阻止 DNS 查找。它也可能在代理协商和/或初始 HTTP 连接期间阻塞。

较旧的版本HttpClient只是在HttpWebRequest. 我请求了一个真正异步的HttpClient,但从未收到回复。上次检查HttpClient时,它仍然是 MVC 的一部分;那时还没有 ASP.NET Web API,所以他们可能HttpClient从那时起就已经修复了。或者WebClient您的机器之间和机器上的行为差异HttpClient可能与 DNS 缓存等有关。

于 2012-04-30T16:15:17.180 回答