我正在使用silverlight 4和新的异步CTP。
private void button1_Click(object sender, RoutedEventArgs e)
{
WebClient wb = new WebClient();
var t = wb.DownloadStringTaskAsync("http://www.google.com");
t.Wait();
}
此代码会导致UI冻结 另一方面,这段代码工作正常:
private void button1_Click(object sender, RoutedEventArgs e)
{
WebClient wb = new WebClient();
var t = Task.Factory.StartNew(() => Debug.WriteLine("Doing something"));
t.Wait();
}
两者之间的区别是什么导致第一个冻结的原因是什么?
答案 0 :(得分:0)
.Wait()
阻止任务直到完成。
第一个示例执行实际操作,即提取 www.google.com 并且使用.Wait()
将不允许事件处理程序返回,直到该页面已下载。
第二个示例仅调用Debug.WriteLine
,即立即返回的调用,允许任务立即完成,因此您从未注意到.Wait()
正在阻止事件处理程序。
您很可能希望使用.ContinueWith()
代替.Wait()
来访问异步下载的结果。这样事件处理程序会立即返回,您可以将代码放在.ContinueWith()
块中,以便对下载的数据执行某些操作。