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

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

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

Всем привет! Пытаюсь разобраться с асинхронным вызовом методов. Узнал такую вещь: если предполагается, что некоторый метод может долго выполнятся, то его можно перенести в "фоновое" выполнение, а управление отдать в вызывающий метод. Решил разобраться с этим и написал для начала обычный код без асинхронного программирования.
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();
    }
}
Здесь вроде все понятно, пока загружается 100мб файл, соответственно остальные инструкции в методе Download() не выполняются до окончания загрузки. То есть идет последовательное выполнение. Далее я решил поэкспериментировать с await и async и написал следующий код:
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 и под них изменен метод на DownloadDataTaskAsync. В этом коде я ожидал такое поведение: 1. Файл начинает скачиваться. 2. Так как закачка переходит в фоновый режим, то управление возвращается методу Download(), и следовательно выводится на консоль Welcome to Hell. 3. По окончании загрузки файла выводится результат Length. Однако всего этого не происходит, а вместо этого просто запускается консоль без единого сообщения, кроме того, чтобы я нажал эникей. Почему так происходит, или где я ошибся в коде? Спасибо.

Решение задачи: «Асинхронное программирование 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);//ждем
        }
    }

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


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

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

13   голосов , оценка 4 из 5
Похожие ответы