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