webClient.DownloadStringTaskAsync (). Wait () останавливает интерфейс - PullRequest
0 голосов
/ 01 августа 2011

Я использую 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 Ответ

0 голосов
/ 04 августа 2011

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

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

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

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

...