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

tug*_*erk 3 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;   
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

很容易。但是,当我单击该按钮时,我在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;   
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

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

较旧的发行版HttpClient只是使用包装器HttpWebRequest。我要求一个真正异步的HttpClient,但从未听到任何回应。我上次检查时HttpClient,它仍然是MVC的一部分;ASP.NET Web API当时还没有出现,因此HttpClient从那时起它们可能已经修复。或者,您的计算机WebClientHttpClient计算机之间的行为差​​异可能仅与DNS缓存或某些此类缓存有关。