Асинхронное программирование await async - C#
Формулировка задачи:
Всем привет!
Пытаюсь разобраться с асинхронным вызовом методов. Узнал такую вещь: если предполагается, что некоторый метод может долго выполнятся, то его можно перенести в "фоновое" выполнение, а управление отдать в вызывающий метод. Решил разобраться с этим и написал для начала обычный код без асинхронного программирования.
Здесь вроде все понятно, пока загружается 100мб файл, соответственно остальные инструкции в методе Download() не выполняются до окончания загрузки. То есть идет последовательное выполнение. Далее я решил поэкспериментировать с await и async и написал следующий код:
Как видно, логика кода такая же, только добавлены await и async и под них изменен метод на DownloadDataTaskAsync.
В этом коде я ожидал такое поведение:
1. Файл начинает скачиваться.
2. Так как закачка переходит в фоновый режим, то управление возвращается методу Download(), и следовательно выводится на консоль Welcome to Hell.
3. По окончании загрузки файла выводится результат Length.
Однако всего этого не происходит, а вместо этого просто запускается консоль без единого сообщения, кроме того, чтобы я нажал эникей. Почему так происходит, или где я ошибся в коде?
Спасибо.
Листинг программы
- class Test
- {
- public static void Download()
- {
- WebClient wc = new WebClient();
- byte[] data = wc.DownloadData(@"http://www.ukraine.com.ua/static/100MB.bin");
- Console.WriteLine("Welcome to");
- Console.WriteLine("Hell");
- Console.WriteLine(data.Length);
- }
- static void Main()
- {
- Download();
- }
- }
Листинг программы
- class Test
- {
- public async static void Download()
- {
- WebClient wc = new WebClient();
- byte[] data = await wc.DownloadDataTaskAsync(@"http://www.ukraine.com.ua/static/100MB.bin");
- Console.WriteLine("Welcome to");
- Console.WriteLine("Hell");
- Console.WriteLine(data.Length);
- }
- static void Main()
- {
- Download();
- }
- }
Решение задачи: «Асинхронное программирование await async»
textual
Листинг программы
- class Program
- {
- public async static void Download()
- {
- WebClient wc = new WebClient();
- var task = wc.DownloadDataTaskAsync(@"http://www.ukraine.com.ua/static/100MB.bin");
- Console.WriteLine("Welcome to");
- Console.WriteLine("Hell");
- byte[] data = await task;
- Console.WriteLine(data.Length);
- }
- static void Main()
- {
- Download();
- while(true)
- Thread.Sleep(1000);//ждем
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д