webClient.DownloadStringTaskAsync().Wait() зависает в пользовательском интерфейсе

Я использую 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();            
        }

Этот код приводит к зависанию пользовательского интерфейса.
С другой стороны, этот код работает нормально:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            WebClient wb = new WebClient();
            var t = Task.Factory.StartNew(() => Debug.WriteLine("Doing something"));
            t.Wait();            
        }

В чем разница между ними и что вызывает зависание первого?


person Yaron Levi    schedule 31.07.2011    source источник


Ответы (1)


.Wait() блокирует задачу, пока она не будет завершена.

Первый пример действительно работает, т. е. извлекает www.google.com и с .Wait() не позволяет обработчику событий возвращаться, пока эта страница не будет загружена.

Во втором примере просто вызывается Debug.WriteLine, т. е. вызов, который возвращается немедленно, позволяя задаче завершиться немедленно, поэтому вы никогда не замечали, что .Wait() блокирует обработчик событий.

Скорее всего, вы захотите использовать .ContinueWith() вместо .Wait() для доступа к результату асинхронной загрузки. Таким образом, обработчик событий немедленно возвращается, и вы можете поместить код в блок .ContinueWith(), чтобы что-то сделать с загруженными данными.

person Arne Claassen    schedule 04.08.2011
comment
Но первый пример никогда не заканчивается. Он застрял. это почему ? - person Yaron Levi; 05.08.2011
comment
Когда я запускаю этот код, он возвращается почти сразу. Лучший вариант — это проблема с сетью, из-за которой запрос никогда не подключается. Прокси указывает не на тот сервер, плохой DNS, не уверен. - person Arne Claassen; 05.08.2011