C#带或不带wait调用的异步方法调用给出相同的结果?
我有一个简单的程序来测试async/await,2个版本:版本1等待异步函数中的另一个方法,版本不: 方案1: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(
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(“异步结束”);
}
}
两个程序产生相同的结果。我只是好奇,这两个程序在后台发生的事情是否有所不同
这两种方法都是异步或线程编程,使用等待方式,直到函数执行为止。执行指针将保留在函数本身上,如果不使用等待,它将传递到下一个执行指针。大多数情况下,在winform应用程序中添加等待有两个原因,而在执行大型进程时,我们可能需要让软件用户以相同的形式完成其他工作,然后我们需要等待任务。或者有时我们需要从一个方法中获取一些数据,以便该方法应该完成,并且下一个逻辑应该在新线程或其他线程中执行 注意没有线程…这段代码有几个问题:(1)为什么要使用Thread.Sleep?(2) 为什么主方法不是异步的?(3) 为什么调用AsyncMethod()时没有继续或异常处理程序?(4) Async并不意味着threads您希望看到什么?(5)除了在处理程序中,不要使用“Async void”(而是使用“usync Task”),如果不使用Thread.sleep,那么我应该使用哪种睡眠?