代码之家  ›  专栏  ›  技术社区  ›  Hind Forsum

C#带或不带wait调用的异步方法调用给出相同的结果?

  •  -3
  • Hind Forsum  · 技术社区  · 6 年前

    我有一个简单的程序来测试async/await,2个版本:版本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将创建一个子线程。正当

    2. 只要“wait”将一直等到任务结束,那么与编写同步代码有什么区别呢?我认为它只是链接创建几个线程并为所有线程调用“.join()”。正当

    1 回复  |  直到 6 年前
        1
  •  1
  •   agsk    6 年前

    两者都是异步或线程编程,使用等待方式,直到函数执行为止。执行指针将保留在函数本身上,如果不使用等待,它将传递到下一个执行指针。大多数情况下,在winform应用程序中添加等待有两个原因,而在执行大型进程时,我们可能需要让软件用户以同样的形式做其他工作,我们需要等待任务。或者有时我们需要从一个方法中获取一些数据,以便该方法应该完成,并且下一个逻辑应该在新线程或其他线程中执行。