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();            
        }

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

1 ответ

Решение

.Wait() блокирует задание до его завершения.

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

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

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

Другие вопросы по тегам