当前位置: 首页 > news >正文

关于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);
}

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<int> TestAwait()
{Console.WriteLine("执行线程id:" + Thread.CurrentThread.ManagedThreadId);await Task.Delay(2000);Console.WriteLine("执行完线程id:" + Thread.CurrentThread.ManagedThreadId);return 1;
}

http://www.lryc.cn/news/284084.html

相关文章:

  • docker硬件交互 _ROS2
  • JS的数据类型和运算符
  • CSS实现平行四边形
  • 第11章 GUI Page500~504 步骤三十二:打开画板文件02
  • 【ROS2】ROS2使用C++实现简单服务端
  • WAF攻防相关知识点总结1--信息收集中的WAF触发及解决方案
  • 行云部署前端架构解析-前言 | 京东云技术团队
  • git提交代码到远端仓库的方法详解
  • 基于网络爬虫的天气数据分析
  • Javaweb之SpringBootWeb案例员工管理之删除员工的详细解析
  • 写点东西《什么是网络抓取?》
  • 使用C#操作文件:一个实际案例——替换文件中的IP地址
  • Zookeeper简介
  • 第33集《佛法修学概要》
  • C++ 之LeetCode刷题记录(十三)
  • 容器技术1-容器与镜像简介
  • openssl3.2 - 官方demo学习 - smime - smdec.c
  • vue中改变v-html中包含body标签的样式修改方法
  • 港科夜闻|香港科大团队研发多功能,可重构和抗破坏单线感测器阵列
  • 线程池的简单介绍及使用
  • 使用Python的pygame库实现下雪的效果
  • qt学习:进度条,水平滑动条,垂直滑动条+rgb调试实战
  • C语言中的浮点数存储
  • Pypputeer自动化
  • selenium爬虫爬取当当网书籍信息 | 最新!
  • PTA 7-1 最大子列和问题
  • JAVA实现向Word模板中插入Base64图片和数据信息
  • 深入浅出关于go web的请求路由
  • HarmonyOS—开发环境诊断的功能
  • Golang个人web框架开发-学习流程