0

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

两者有什么区别,是什么导致第一个冻结?

4

1 回答 1

0

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

第一个示例执行实际工作,即获取www.google.com并且.Wait()在下载该页面之前不允许事件处理程序返回。

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

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

于 2011-08-04T18:32:47.247 回答