Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#带或不带wait调用的异步方法调用给出相同的结果?_C#_Multithreading_Asynchronous_Join_Async Await - Fatal编程技术网

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

C#带或不带wait调用的异步方法调用给出相同的结果?,c#,multithreading,asynchronous,join,async-await,C#,Multithreading,Asynchronous,Join,Async Await,我有一个简单的程序来测试async/await,2个版本:版本1等待异步函数中的另一个方法,版本不: 方案1: class Program { static void Main(string[] args) { Console.WriteLine("main starts.."); AsyncMethod(); Thread.Sleep(1000); Console.WriteLine(

我有一个简单的程序来测试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; 
     } 
 } 
类程序
{ 
静态void Main(字符串[]参数)
{ 
Console.WriteLine(“主启动…”);
异步方法();
睡眠(1000);
控制台写入线(“主端…”);
Console.ReadLine();
} 
静态异步void AsyncMethod()
{ 
WriteLine(“异步启动”);
var result=wait MyMethod();
WriteLine(“异步开始-结束”);
} 
静态异步任务MyMethod()
{ 
对于(int i=0;i<5;i++)
{ 
WriteLine(“异步运行”+i.ToString()+”);
等待任务。延迟(1000);
} 
返回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"); 
     } 
 } 
类程序
{ 
静态void Main(字符串[]参数)
{ 
Console.WriteLine(“主启动…”);
异步方法();
睡眠(1000);
控制台写入线(“主端…”);
Console.ReadLine();
} 
静态异步void AsyncMethod()
{ 
WriteLine(“异步启动”);
对于(int i=0;i<5;i++)
{ 
WriteLine(“异步运行”+i.ToString()+”);
等待任务。延迟(1000);
} 
WriteLine(“异步结束”);
} 
} 
两个程序产生相同的结果。我只是好奇,这两个程序在后台发生的事情是否有所不同

  • 我猜,程序1将创建2个子线程,每个级别的“异步”导致一个线程;程序2将创建一个子线程。对吧?

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


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

    注意没有线程…这段代码有几个问题:(1)为什么要使用Thread.Sleep?(2) 为什么主方法不是异步的?(3) 为什么调用AsyncMethod()时没有继续或异常处理程序?(4) Async并不意味着threads您希望看到什么?(5)除了在处理程序中,不要使用“Async void”(而是使用“usync Task”),如果不使用Thread.sleep,那么我应该使用哪种睡眠?