关于C#中的async/await的理解

1. 使用async标记的方法被认为是一个异步方法,如果不使用await关键字,调用跟普通方法没有区别

 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     TestAwait();

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
}

private static async Task TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    Thread.Sleep(2000);  //模拟耗时操作

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);
}

执行结果:

2.当使用await关键字时,异步方法会暂时挂起,让出当前线程的控制权,而不会阻塞线程。当被await的异步操作完成后,异步方法会恢复执行,并返回结果。

            在大多数情况下,异步操作并不会创建新的线程,而是通过利用I/O完成端口或其他异步机制来实现异步操作。这样可以避免创建额外的线程,提高程序的性能和资源利用率。
 

 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     TestAwait();

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
    
     Console.WriteLine("Hello, World!");

     Console.ReadLine();

}

private static async Task TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);
}

关于C#中的async/await的理解_第1张图片

3.使用task.result获取执行结果,会阻塞调用线程

 static async Task Main(string[] args)
 {
     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);

     int a = TestAwait().Result;

     Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);
    
     Console.WriteLine("Hello, World!");

     Console.ReadLine();

}

private static async Task TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

    Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);

    return 1;
}

关于C#中的async/await的理解_第2张图片

你可能感兴趣的:(C#,语法,c#)