2012-04-30 33 views
2

我创建了一个简单的异步操作,单击该按钮时会被踢掉。下面是整个代码:.NET 4.5中的WPF中的异步事件处理程序无响应

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

顺便说一句在.NET 4.5中有一个新的[HttpClient Class](http://msdn.microsoft.com/zh-cn/library/system.net.http.httpclient(v = vs.110).aspx)这是为'async' /'await'设计的。 – dtb

+0

@dtb我意识到这一点。谢谢,但这里的问题是不同的。 – tugberk

+0

'htmlString'需要多长时间?它可能只需要一些时间来渲染'txtBlock1'。 – dtb

回答

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缓存等有关。

+0

在下载方法(而不是处理程序)内部,它应该ConfigureAwait(false),因为它的特定延续不需要在UI线程上?显然,处理程序不应该这样做。 :) –

+0

我会的。这是最好的做法,但是(在这种情况下),如果他不这样做,它不会导致任何问题(如死锁) - 它只是不如它有效。 –

+0

我认为,既然提问者说HttpClient'制定了出色的',它确实'固定'了你的喜好? –