我创建了一个简单的异步操作,单击该按钮时会触发该操作。这是完整的代码:
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;
}
}
答案 0 :(得分:4)
WebClient
使用HttpWebRequest
,遗憾的是is not very asynchronous,即使您使用“异步”方法也是如此。它至少会阻止DNS查询。它也可能在代理协商和/或初始HTTP连接期间阻塞。
较早版本的HttpClient
只是在HttpWebRequest
周围使用了包装器。我requested a truly-asynchronous HttpClient
,但从未听过回应。我最后一次检查HttpClient
时,它仍然是MVC的一部分;那时ASP.NET Web API还没有出现,所以从那以后他们可能已经修复了HttpClient
。 或您计算机上WebClient
和HttpClient
之间的行为差异可能只与DNS缓存或其他类似行为有关。