反应迟钝,在.NET 4.5中WPF异步事件处理程序(Unresponsiveness with a

2019-07-29 05:33发布

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

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线程上反应迟钝。 当我尝试当页面被下载到周围的窗口移动,我无法。

任何想法是怎么回事?

编辑:

我试着用的HttpClient在.NET 4.5和它的工作非常伟大的预期:

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

Answer 1:

WebClient使用HttpWebRequest ,不幸的是不是很同步 ,即使你使用了“异步”的方法。 它确实阻止DNS查找,至少。 它也可以代理协商和/或初始HTTP连接期间阻塞。

的较旧版本HttpClient只是用周围的包装HttpWebRequest 。 我要求一个真正的异步HttpClient ,但从来没有听说过的响应。 我最后一次检查HttpClient ,它仍然是MVC的一部分; 的ASP.NET Web API不在身边那个时候,所以他们可能有固定HttpClient至今。 或者两者之间的行为差异WebClientHttpClient你的机器上可能只是与DNS缓存或一些这样的事情。



文章来源: Unresponsiveness with async event handlers in WPF in .NET 4.5