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

  1. 使用async标记的方法被认为是一个异步方法,如果不使用await关键字,调用跟普通方法没有区别
cs 复制代码
 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完成端口或其他异步机制来实现异步操作。这样可以避免创建额外的线程,提高程序的性能和资源利用率。

cs 复制代码
 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);
}

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

cs 复制代码
 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<int> TestAwait()
{
    Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

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

    return 1;
}
相关推荐
zlinear数据采集卡12 分钟前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
花落人散处4 小时前
CDiskClean 开发历程 —— 文件清理_目录树解析实现方案参考
c#
离陌在学C#4 小时前
C# 泛型:从基础到高级应用
开发语言·c#
Vertira4 小时前
C# 与 OpencvSharp 编程[基础目录]
c#
格林威6 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
yuhulkjv33515 小时前
Claude表格复制到word不再崩溃,AI导出鸭批量导出+格式无损一键搞定
人工智能·ai·c#·word·ai导出鸭
arbboter20 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
微小冷20 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
吴可可1231 天前
C#重写机制与CAD图元开发要点
c#
A_nanda1 天前
c#WPF开发常见问题
开发语言·c#·wpf