webClient.DownloadStringTaskAsync()。Wait()冻结UI

时间:2011-07-31 22:16:53

标签: silverlight-4.0 task parallel-processing async-ctp

我正在使用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();            
        }

两者之间的区别是什么导致第一个冻结的原因是什么?

1 个答案:

答案 0 :(得分:0)

.Wait()阻止任务直到完成。

第一个示例执行实际操作,即提取 www.google.com 并且使用.Wait()将不允许事件处理程序返回,直到该页面已下载。

第二个示例仅调用Debug.WriteLine,即立即返回的调用,允许任务立即完成,因此您从未注意到.Wait()正在阻止事件处理程序。

您很可能希望使用.ContinueWith()代替.Wait()来访问异步下载的结果。这样事件处理程序会立即返回,您可以将代码放在.ContinueWith()块中,以便对下载的数据执行某些操作。