Пожалуйста, посмотрите на этот код:Почему некоторые методы асинхронных выполняются синхронно
class Program
{
static async void DoStuff()
{
StreamWriter s = new StreamWriter("a.txt");
WebClient wc = new WebClient();
await wc.DownloadStringTaskAsync(new Uri("http://www.microsoft.com")); //1
//await s.WriteAsync ("123"); //2
Thread.Sleep(10000);
Console.WriteLine("DoStuffEnd");
}
static void Main(string[] args)
{
Program.DoStuff();
Console.WriteLine("MainEnd");
Console.Read();
}
}
В этой ситуации все в порядке, в соответствии с логикой асинхронном/ждать.
Выходные:
MainEnd
Через 10 секунд
DoStuffEnd
Но если я комментарий (1) и раскомментируйте (2), выход это:
Через 10 секунд
DoStuffEnd
MainEnd
Почему?
Ваш 'main()' не может "заканчиваться" перед любой другой функцией, потому что это будет «конец» вашей программы. – Nasreddine
К тому времени, когда сгенерированный код 'await' смотрит на задачу, чтобы проверить, завершено ли это, какой в вашем случае для загрузки нет, если к тому времени он уже завершен (как и у вашего случая записи потока), то он просто продолжается синхронно. –