C # Асинхронный вызов метода с или без ожидания вызова дает тот же результат? - PullRequest
0 голосов
/ 27 января 2019

У меня есть простая программа для тестирования async / await, 2 версии: версия 1 ожидает другого метода внутри асинхронной функции, версия не:

Программа 1:

 class Program 
 { 
     static void Main(string[] args) 
     { 
         Console.WriteLine("main starts.."); 
         AsyncMethod(); 
         Thread.Sleep(1000); 
         Console.WriteLine("main ends.."); 
         Console.ReadLine(); 
     } 
     static async void AsyncMethod() 
     { 
         Console.WriteLine("async starts"); 
         var result = await MyMethod(); 
         Console.WriteLine("async starts ends"); 
     } 

     static async Task<int> MyMethod() 
     { 
         for (int i = 0; i < 5; i++) 
         { 
             Console.WriteLine("async runs" + i.ToString() + ".."); 
             await Task.Delay(1000); 
         } 
         return 0; 
     } 
 } 

Программа2:

 class Program 
 { 
     static void Main(string[] args) 
     { 
         Console.WriteLine("main starts.."); 
         AsyncMethod(); 
         Thread.Sleep(1000); 
         Console.WriteLine("main ends.."); 
         Console.ReadLine(); 
     } 
     static async void AsyncMethod() 
     { 
         Console.WriteLine("async starts"); 
         for (int i = 0; i < 5; i++) 
         { 
             Console.WriteLine("async runs" + i.ToString() + ".."); 
             await Task.Delay(1000); 
         } 
         Console.WriteLine("async ends"); 
     } 
 } 

Обе программы дают одинаковый результат.Мне просто любопытно, отличаются ли обе программы тем, что происходит в фоновом режиме?

  1. Полагаю, программа 1 создаст 2 подпотока, каждый уровень асинхронности ведет к потоку;Программа 2 создаст 1 подпоток.Правильно?

  2. До тех пор, пока "ожидание" будет ждать, пока задача не закончится, в чем же отличие от написания синхронного кода?Я думаю, что это просто ссылка, создающая несколько потоков, и вызов ".join ()" для всех из них.Правильно?

1 Ответ

0 голосов
/ 27 января 2019

Оба являются асинхронным или многопоточным программированием с использованием средств await до тех пор, пока ваша функция не выполнит ваш указатель выполнения, который будет удерживаться на этих функциях самостоятельно, и если вы не используете wait, он перейдет к следующему указателю выполнения, главным образом, есть две причины для добавленияв основном ожидаем в приложении winform, в то время как при выполнении большого процесса нам может понадобиться позволить пользователю программного обеспечения выполнять другую работу в той же форме, что и нам, чтобы дождаться выполнения задачи.или иногда нам нужно получить некоторые данные из одного метода, поэтому метод должен быть завершен, а следующая логика должна выполняться в новом или другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...