【发布时间】:2012-05-10 07:17:32
【问题描述】:
我创建了一个简单的异步操作,当单击按钮时它会被踢出。这是整个代码:
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;
}
}
【问题讨论】:
-
顺便说一句,.NET 4.5 中有一个新的HttpClient Class 专为
async/await设计。 -
@dtb 我知道这一点。谢谢,但这里的问题不同。
-
htmlString有多长?用它渲染txtBlock1可能只需要一些时间。 -
@dtb 你认为更新
WebClient会导致阻塞吗? -
不,创建
WebClient实例真的很轻量级。你检查过htmlString有多长(见我上面的评论)?
标签: c# wpf asynchronous async-await .net-4.5