[英]Unresponsiveness with async event handlers in WPF in .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;
}
}
WebClient
使用HttpWebRequest
,遺憾的是 ,即使您使用“異步”方法,也不是非常異步 。 它至少會阻止DNS查詢。 它也可能在代理協商和/或初始HTTP連接期間阻塞。
舊版本的HttpClient
只是在HttpWebRequest
周圍使用了一個包裝器。 我請求了一個真正異步的HttpClient
,但從未聽過響應。 我最后一次檢查HttpClient
,它仍然是MVC的一部分; 那時ASP.NET Web API還沒有出現,所以從那以后他們可能已經修復了HttpClient
。 或者 ,您的計算機上的WebClient
和HttpClient
之間的行為差異可能只與DNS緩存或其他類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.