Silverlight 4.0 webClient.DownloadStringTaskAsync().Wait()冻结UI
我正在使用Silverlight4和新的异步CTPSilverlight 4.0 webClient.DownloadStringTaskAsync().Wait()冻结UI,silverlight-4.0,task,parallel-processing,async-ctp,Silverlight 4.0,Task,Parallel Processing,Async Ctp,我正在使用Silverlight4和新的异步CTP private void button1_Click(object sender, RoutedEventArgs e) { WebClient wb = new WebClient(); var t = wb.DownloadStringTaskAsync("http://www.google.com"); t.Wait();
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();
}
这两者之间有什么区别,是什么导致第一个冻结?.Wait()
阻塞任务,直到任务完成
第一个示例进行实际工作,即获取www.google.com并使用。Wait()
将不允许事件处理程序返回,直到该页面被下载
第二个示例仅调用Debug.WriteLine
,即立即返回的调用,允许任务立即完成,因此您从未注意到.Wait()
正在阻止事件处理程序
您很可能希望使用
.ContinueWith()
而不是.Wait()
来访问异步下载的结果。这样,事件处理程序会立即返回,您可以将代码放入.ContinueWith()
块中,对下载的数据进行处理。但第一个示例永远不会结束。它卡住了。为什么?当我运行代码时,它几乎立即返回。最佳选择是网络问题,它会阻止请求连接。代理指向错误的服务器,dns错误,不确定。