对.NET 4.5中的WPF中的异步事件处理程序没有响应

时间:2012-04-30 15:27:58

标签: c# wpf asynchronous async-await .net-4.5

我创建了一个简单的异步操作,单击该按钮时会触发该操作。这是完整的代码:

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;   
    }
}

1 个答案:

答案 0 :(得分:4)

WebClient使用HttpWebRequest,遗憾的是is not very asynchronous,即使您使用“异步”方法也是如此。它至少会阻止DNS查询。它也可能在代理协商和/或初始HTTP连接期间阻塞。

较早版本的HttpClient只是在HttpWebRequest周围使用了包装器。我requested a truly-asynchronous HttpClient,但从未听过回应。我最后一次检查HttpClient时,它仍然是MVC的一部分;那时ASP.NET Web API还没有出现,所以从那以后他们可能已经修复了HttpClient您计算机上WebClientHttpClient之间的行为差​​异可能只与DNS缓存或其他类似行为有关。