tug*_*erk 3 c# wpf asynchronous async-await .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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
很容易。但是,当我单击该按钮时,我在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;
}
}
Run Code Online (Sandbox Code Playgroud)
WebClient使用HttpWebRequest,即使您使用“异步”方法,它也不是非常异步的。至少它会阻止DNS查找。它还可能在代理协商和/或初始HTTP连接期间阻塞。
较旧的发行版HttpClient只是使用包装器HttpWebRequest。我要求一个真正异步的HttpClient,但从未听到任何回应。我上次检查时HttpClient,它仍然是MVC的一部分;ASP.NET Web API当时还没有出现,因此HttpClient从那时起它们可能已经修复。或者,您的计算机WebClient与HttpClient计算机之间的行为差异可能仅与DNS缓存或某些此类缓存有关。
| 归档时间: |
|
| 查看次数: |
1710 次 |
| 最近记录: |