【问题标题】:C# async method call with or without await call gives same result?有或没有等待调用的 C# 异步方法调用给出相同的结果?
【发布时间】:2019-06-20 18:22:33
【问题描述】:

我有一个简单的程序来测试 async/await,有 2 个版本:版本 1 在 async 函数中等待另一个方法,版本没有:

方案一:

 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; 
     } 
 } 

方案二:

 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)你为什么使用Thread.Sleep? (2) 为什么你的 Main 方法不是异步的? (3) 为什么要调用 AsyncMethod() 而没有继续或异常处理程序? (4) 异步不代表线程
  • 你期待看到什么?
  • (5) 不要在处理程序中使用“async void”(改用“usync Task”)
  • 如果不使用Thread.sleep,那我应该使用什么样的睡眠呢?

标签: c# multithreading asynchronous join async-await


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2021-09-15
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2013-11-16
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多