我创建了一个简单的异步操作,当单击按钮时该操作将被踢出。这是整个代码:
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 线程没有响应。当我在下载页面时尝试在窗口中移动时,我无法做到。
知道出了什么问题吗?
Edit:
我在 .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
uses HttpWebRequest
,不幸的是不是很异步 http://social.msdn.microsoft.com/Forums/en-US/async/thread/9f75f92c-9a51-4921-bad5-97c2b15870bd,即使您使用“异步”方法。它至少会执行阻塞 DNS 查找。它还可能在代理协商和/或初始 HTTP 连接期间阻塞。
较旧的版本HttpClient
只是使用了一个包装器HttpWebRequest
. I 请求一个真正的异步HttpClient http://wcf.codeplex.com/discussions/267781,但从未听到回应。我上次检查时HttpClient
,它仍然是MVC的一部分; ASP.NET Web API 当时还不存在,所以他们可能已经修复了HttpClient
自那以后。Or之间的行为差异WebClient
and HttpClient
你的机器上可能只与 DNS 缓存或类似的东西有关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)