Асинхронное программирование await async - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Пытаюсь разобраться с асинхронным вызовом методов. Узнал такую вещь: если предполагается, что некоторый метод может долго выполнятся, то его можно перенести в "фоновое" выполнение, а управление отдать в вызывающий метод. Решил разобраться с этим и написал для начала обычный код без асинхронного программирования.
Листинг программы
  1. class Test
  2. {
  3. public static void Download()
  4. {
  5. WebClient wc = new WebClient();
  6. byte[] data = wc.DownloadData(@"http://www.ukraine.com.ua/static/100MB.bin");
  7. Console.WriteLine("Welcome to");
  8. Console.WriteLine("Hell");
  9. Console.WriteLine(data.Length);
  10. }
  11. static void Main()
  12. {
  13. Download();
  14. }
  15. }
Здесь вроде все понятно, пока загружается 100мб файл, соответственно остальные инструкции в методе Download() не выполняются до окончания загрузки. То есть идет последовательное выполнение. Далее я решил поэкспериментировать с await и async и написал следующий код:
Листинг программы
  1. class Test
  2. {
  3. public async static void Download()
  4. {
  5. WebClient wc = new WebClient();
  6. byte[] data = await wc.DownloadDataTaskAsync(@"http://www.ukraine.com.ua/static/100MB.bin");
  7. Console.WriteLine("Welcome to");
  8. Console.WriteLine("Hell");
  9. Console.WriteLine(data.Length);
  10. }
  11. static void Main()
  12. {
  13. Download();
  14. }
  15. }
Как видно, логика кода такая же, только добавлены await и async и под них изменен метод на DownloadDataTaskAsync. В этом коде я ожидал такое поведение: 1. Файл начинает скачиваться. 2. Так как закачка переходит в фоновый режим, то управление возвращается методу Download(), и следовательно выводится на консоль Welcome to Hell. 3. По окончании загрузки файла выводится результат Length. Однако всего этого не происходит, а вместо этого просто запускается консоль без единого сообщения, кроме того, чтобы я нажал эникей. Почему так происходит, или где я ошибся в коде? Спасибо.

Решение задачи: «Асинхронное программирование await async»

textual
Листинг программы
  1.     class Program
  2.     {
  3.         public async static void Download()
  4.         {        
  5.             WebClient wc = new WebClient();
  6.             var task = wc.DownloadDataTaskAsync(@"http://www.ukraine.com.ua/static/100MB.bin");        
  7.             Console.WriteLine("Welcome to");
  8.             Console.WriteLine("Hell");
  9.             byte[] data = await task;
  10.             Console.WriteLine(data.Length);
  11.         }
  12.  
  13.         static void Main()
  14.         {
  15.             Download();
  16.            
  17.             while(true)
  18.                 Thread.Sleep(1000);//ждем
  19.         }
  20.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы