带有或不带有await调用的C#异步方法调用是否给出相同的结果?

时间:2019-01-27 16:30:42

标签: c# multithreading asynchronous join async-await

我有一个简单的程序来测试async / await,有两个版本:版本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. 只要“ await”将一直等到任务结束,那么与编写同步代码有何区别?我认为它只是链接创建多个线程,并为所有线程调用“ .join()”。对吧?

1 个答案:

答案 0 :(得分:1)

这两种都是使用await的异步或线程编程,直到函数执行您的执行指针将自身保留在该函数上,如果不使用wait,它将继续传递到下一个执行指针,这主要是由于添加了两个原因在等待大型程序执行时,主要在winform应用程序中等待,我们可能需要让软件用户以相同的形式完成其他工作,然后才需要等待任务。有时我们需要从一个方法中获取一些数据,因此该方法应完成,并且下一个逻辑应在新线程或其他线程中执行。