我有一个简单的程序来测试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将创建2个子线程,每个级别的“异步”都会导致一个线程;程序2将创建1个子线程。对吧?
只要“ await”将一直等到任务结束,那么与编写同步代码有何区别?我认为它只是链接创建多个线程,并为所有线程调用“ .join()”。对吧?
答案 0 :(得分:1)
这两种都是使用await的异步或线程编程,直到函数执行您的执行指针将自身保留在该函数上,如果不使用wait,它将继续传递到下一个执行指针,这主要是由于添加了两个原因在等待大型程序执行时,主要在winform应用程序中等待,我们可能需要让软件用户以相同的形式完成其他工作,然后才需要等待任务。有时我们需要从一个方法中获取一些数据,因此该方法应完成,并且下一个逻辑应在新线程或其他线程中执行。