【问题标题】:Unresponsiveness with async event handlers in WPF in .NET 4.5.NET 4.5 中 WPF 中的异步事件处理程序无响应
【发布时间】:2012-05-10 07:17:32
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,.NET 4.5 中有一个新的HttpClient Class 专为async/await 设计。
  • @dtb 我知道这一点。谢谢,但这里的问题不同。
  • htmlString 有多长?用它渲染txtBlock1 可能只需要一些时间。
  • @dtb 你认为更新WebClient 会导致阻塞吗?
  • 不,创建WebClient 实例真的很轻量级。你检查过htmlString 有多长(见我上面的评论)?

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


【解决方案1】:

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

HttpClient 的旧版本只是在 HttpWebRequest 周围使用了一个包装器。我requested a truly-asynchronous HttpClient,但从未收到回复。上次查HttpClient,还是MVC的一部分;那时还没有 ASP.NET Web API,所以他们可能已经修复了HttpClient或者您机器上WebClientHttpClient 之间的行为差​​异可能与DNS 缓存等有关。

【讨论】:

  • 在下载方法(而不是处理程序)中,它是否应该 ConfigureAwait(false),因为它的特定延续不需要在 UI 线程上?显然,处理程序不应该这样做。 :)
  • 我愿意。这样做是最佳实践,但(在这种情况下)如果他不这样做,它不会导致任何问题(如死锁) - 它只是没有它可能的效率。
  • 我认为既然提问者说 HttpClient “效果很好”,它确实是“固定”到你喜欢的?
  • 我相信它还没有被修复。我在 dotPeek 中检查了它,并且存在相同的调用结构(HttpClient -> HttpWebRequest -> ServicePoint -> 阻止 DNS 请求)。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
相关资源
最近更新 更多