最新要闻
- 北向资金全天小幅净卖出6.41亿元 时讯
- 读懂“中文大脑”,破解阅读障碍
- 信用卡逾期收到律师函怎么办?信用卡逾期律师函来了后果严重吗?
- 新动态:彩票为什么不能网上卖_彩票为什么不能网上买
- 首款骁龙8 Gen2平板要来了:内置散热风扇 游戏神器|环球今头条
- 每日报道:AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款了
- 电池有缺陷被特斯拉踢出供应链?宁德时代辟谣:消息不实
- 宣告放弃LCD材料!三星、LG供应商默克集团全力研发MicroLED等新材料
- 天天速讯:高考查分遇上端午假期:31省成绩23日起陆续公布
- 台电P76t_台电p76v
- 红楼梦摘抄400字_红楼梦摘抄
- 【全球新视野】柔道著名运动员(郝义 柔道运动员)
- 五证一书指什么生肖(五证一书指什么)|世界最新
- A股分红派息转增一览:43股今日股权登记
- 每日焦点!苹果或重新发明苹果汽车安全带:打造发光安全带扣
- 又瞎折腾!Windows 11将删除9个文件夹选项
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
C#语言async, await 简单介绍与实例(入门级) 当前聚焦
本文介绍异步编程的基本思想和语法。在程序处理里,程序基本上有两种处理方式:同步和异步。对于有些新手,甚至认为“同步”是同时进行的意思,这显然是错误的。
同步的基本意思是:程序一个个执行方法,或者说在方法调用上,fun1(), fun2(), fun3(),fun4()..按顺序调用,而异步的意思是:方法不是按顺序执行,可能fun2执行的时间比较长
那就先执行fun3,fun4。等执行完了fun2在执行后面的fun1,fun6,fun7...,很显然,异步编程比同步编程复杂很多,因为他涉及到线程的同步。
(资料图片)
注意:对于单核CPU来说,任一时刻只能执行一条指令,对于这种微观观点,我们不用太过于深究,因为操作系统会帮助我们调度。换句话说,我们一边打印word文档,一边听歌,一边写字
虽然我们感觉是“同时”进行的,但是其实是CPU是在后台不停的帮助我们切换进程,只是CPU切换的速度太快了,让我们感觉我们是在“同时”做很多件事。
(一)基本异步示例
下面代码演示了一个基本上异步程序:(程序使用VS2022+.NET 7.0开发的)
(1)HandleFileAsync()表示这是一个异步的方法,方法名称前有一个await关键字。
作为一个约定,方法总是以Async结尾,这样,使用者看到这个方法就知道了这是一个异步方法,这仅仅是方法名称的一个约定,不加Async不影响使用。
(2)在HandleFileAsync方法里,模拟执行一些费时的操作。
(3)在HandleFileAsync执行期间,不会阻塞主线程,现在输入字符串 123 ,系统会显示出入的结果。
(4)在异步方法执行完毕后,返回主线程,输出计数的结果。
using System;using System.IO;using System.Threading.Tasks;class Program{ public static void Main() { // Part 1: 开始处理大文件文件 Tasktask = HandleFileAsync(); // 在文件处理前,把控制权交给控制台 // 让用户输入一些文字 Console.WriteLine("请耐心等待,系统正在处理文件," +" 但是此时,你可以输入一些字母,回车后显示"); // 在文件处理时,同时读取你的输入 string line = Console.ReadLine(); Console.WriteLine("你刚刚输入的是: " + line); // Part 3: 等候处理结果 // 显示处理结果 task.Wait(); var x = task.Result; Console.WriteLine("计数: " + x); Console.WriteLine("程序运行完毕!"); Console.ReadLine(); } static async Task HandleFileAsync() { string file = @"C:\qmx\token.txt"; // Part 2: 下面开始处理大文件 Console.WriteLine("文件处理开始"); int count = 0; // 读取文件 using (StreamReader reader = new StreamReader(file)) { string v = await reader.ReadToEndAsync(); // 处理数据 count += v.Length; // 这里是模拟代码,并没有实际的意义, 让程序执行1000万次, // 纯粹是模拟这是一个耗时的操作 for (int i = 0; i < 1000000; i++) { int x = v.GetHashCode(); if (x == 0) { count--; } } } Console.WriteLine("文件处理结束"); return count; }}
下面显示的是运行结果
当然上面后面的代码可以简写为var x =await task.Result;
(二)线程阻塞(死锁)
在上面方法里,必须小心的调用 Wait方法,因为处理不好,很容易发生任务阻塞。Stephen Cleary曾经给了一个典型的例子:见
https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
想象一下,我们有一个winForm应用程序,里面有一个Button,在Button的点击事件里,我们调用 HttpClient 的 GetStringAsync 方法获取返回的JSON字符串,然后把字符串显示在文本框里。
为此,我们编写了如下代码:
// Button的点击事件public void Button1_Click(...){//获取Web返回的字符串 var jsonTask = GetJsonAsync(...);//把字符串显示在文本框里 textBox1.Text = jsonTask.Result;}public static async TaskGetJsonAsync(Uri uri){ // 调用 HttpClient 的 GetStringAsync 方法获取JSON using (var client = new HttpClient()) { var jsonString = await client.GetStringAsync(uri); return JObject.Parse(jsonString); }}
现在你运行上面的代码,当你点击按钮时,你会发现程序没有出现你所想要的结果:因为程序被卡死了,根本无法进行其他操作。除了终止应用程序,你别无选择。为什么会发生什么死锁现象呢?
为了让通俗解释死锁看下面一个例子:假设我们有一把蓝钥匙,可以打开一扇蓝色门;以及一把红钥匙,可以打开一扇红色门。两把钥匙被保存在一个皮箱里。同时我们定义六种行为:获取蓝钥匙,打开蓝色门,归还蓝钥匙,获取红钥匙,打开红色门,归还红钥匙。如下图:你可以把6个行为理解为函数里6个方法 (以下内容改写自知乎)
如果是同步编程,方法一个个调用,没有问题
但是,当异步调动时,每个方法顺序就不那么确定了,就可能出现如下这个情况
可以看到,当两个线程都运行到第三步的时候,线程A在等线程B归还红钥匙,线程B在等线程A归还蓝钥匙,因而两个线程都永远卡在那里无法前进。这就是形成了死锁。
理解了上面的死锁,回头再来看为什么winForm里产生了死锁,主线程调用异步方法返回的结果,被告知方法未完成,因此主线程在等待方法完成。
当异步方法完成后,把自己状态告知主线程已经Compled时,但是主线程一直在繁忙状态,他在等待任务完成,因此,发生了死锁。
这告诉我们在异步编程时,要特别需要注意死锁的问题。作为一个简单的解决方法:只要加一个await异步就可以了
public async void Button1_Click(...){ var json = awaitGetJsonAsync(...); textBox1.Text = json;}
这也就是大家常说“一路异到底”。(不要在同步方法里调用异步方法,要异步调用异步,一路异到底)
(三)ContinueWith
在现实世界里,经常会发生在一个方法完成之后,在进行下一个方法的调用,例如,在Button 事件里 (1)异步从网络获取HTML源代码。 (2)把源代码写入 C:\File.txt 里
这就需要第二步骤需要在第一步完成之后运行,此时需要用到ContinueWith 方法。
下面的代码简单演示了ContinueWith (其实,ContinueWith这个方法的名字就已经很好的解释了他的作用)
using System;using System.Threading.Tasks;class Program{ static void Main() { //调用10次异步方法 for (int i = 0; i < 10; i++) { Run2Methods(i); } //所有调用都是异步 Console.ReadLine(); } static async void Run2Methods(int count) { // 在调动完后,调用 ContinueWith 继续操作 int result = await Task.Run(() => GetSum(count)) .ContinueWith(task => MultiplyNegative1(task)); Console.WriteLine("Run2Methods 结果: " + result); } static int GetSum(int count) { //这里模拟一些额外操作 int sum = 0; for (int z = 0; z < count; z++) { sum += (int)Math.Pow(z, 2); } return sum; } static int MultiplyNegative1(Tasktask) { // 这里模拟对数字取其相反数 return task.Result * -1; }}
下面显示了运行结果
上面简单的介绍了异步编程。
关键词:
C#语言async, await 简单介绍与实例(入门级) 当前聚焦
北向资金全天小幅净卖出6.41亿元 时讯
读懂“中文大脑”,破解阅读障碍
信用卡逾期收到律师函怎么办?信用卡逾期律师函来了后果严重吗?
新动态:彩票为什么不能网上卖_彩票为什么不能网上买
首款骁龙8 Gen2平板要来了:内置散热风扇 游戏神器|环球今头条
每日报道:AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款了
电池有缺陷被特斯拉踢出供应链?宁德时代辟谣:消息不实
宣告放弃LCD材料!三星、LG供应商默克集团全力研发MicroLED等新材料
天天速讯:高考查分遇上端午假期:31省成绩23日起陆续公布
台电P76t_台电p76v
红楼梦摘抄400字_红楼梦摘抄
【全球新视野】柔道著名运动员(郝义 柔道运动员)
五证一书指什么生肖(五证一书指什么)|世界最新
A股分红派息转增一览:43股今日股权登记
每日焦点!苹果或重新发明苹果汽车安全带:打造发光安全带扣
又瞎折腾!Windows 11将删除9个文件夹选项
帮人就是帮己!西南大学校长毕业寄语被狂赞:外卖别随意给差评 大胆扶摔倒老人_环球观焦点
keycloak~CountDownLatch在keycloak中的使用 资讯推荐
高精度离线免费 的C#文字识别PaddleOCR库|速递
环球快讯:星纪魅族官宣参展2023 MWC上海:Flyme Auto、魅族20系列重磅登场
每日热文:余承东大喜!工信部:支持L3级及更高级别自动驾驶功能商业化应用
鲜嫩入味 Q弹不柴:驰迈即时鸡胸肉50g*5袋9.9元_天天看点
全球时讯:《闪电侠》预示华纳影业面临巨大亏空
环球今热点:国服关停5个月后:成都猎人队宣布彻底退出《守望先锋》联赛
全球简讯:即视角|出海正当时:欧美、东南亚、中东、拉美市场观察
参展动态 | 璞华参展第九届中国(上海)国际技术进出口交易会-全球关注
国泰君安:5月挖机销量略超预期,静待下半年行业复苏
致命摇篮下载 1080p 下载 致命摇篮迅雷下载 全球微动态
【世界新视野】京雄大桥顺利合龙!京雄高速将于年内全线通车(图)
【快播报】印尼很快将不再出口原铜因希望从资源中寻求更多价值金十数据6月21日讯,印度尼西亚总统佐科当地时间周二表示,该国很快将不再出口原铜,因为这一金属将在国内
首销仅售32元:3DMark登陆Epic商店
国内油价冲破上调红线!端午节过后涨价可能性很大
笔记本存储“官方升级”谁最贵最坑?对比后揭晓答案 新资讯
免费玩!国产大作《仙剑奇侠传7》即将登陆XGP订阅服务-当前短讯
演员陈建斌多巴胺穿搭引热议 律师:AI换脸侵犯肖像权
全球热推荐:官宣!NBA历史第一高薪即将诞生,哈登交易方案,勇士3人离队
万能u盘低级格式化工具下载_u盘格式化工具下载-世界热推荐
关于在Redhat-7-linux-系统-Apache-2.4.6-版本上部署多个版本的yum仓库-的配置文件写法
【Java】使用 validation 完成自定义校验注解 今日热文
性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析|世界新视野
视频直播源码技术知识分享:连麦功能(一)
环球即时看!ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
北汽极狐成立法务部:200万粉丝知名汽车博主收到“告知函” 快资讯
中国首位!科学家付巧妹获联合国阿勒福赞奖-全球快播
226元大额券:361板鞋运动鞋休闲鞋74元抄底|全球百事通
离大谱!男子偷马路卖钱:把路分成小块去卖 天天时讯
3岁女童患罕见病 肚大如石鼓随时会“爆炸”:医生科普 续命针1次上万-环球快播
当前滚动:【后端面经-java】java线程池满的处理策略
Rust语言 - 接口设计的建议之受约束(Constrained)_天天最资讯
java~理解可重入锁 焦点速读
硬件博主自费实测5大旗舰手机信号:iPhone各种被狂虐
焦点热文:载亿万富翁观光潜艇失联 被曝用游戏手柄操控 专家:生还希望渺茫
电动汽车也能无线充电了:像手机一样简单 超大充电板长这模样
全球热议:微软停止涨薪影响明显:员工跳槽意愿上涨23%
11499元 三星首款5K专业显示器上架:配可拆卸4K摄像头
环球今日讯!java~字节码操作ASM
班主任和家长扮恐龙接中考生 现场让网友看笑:可爱的显眼包 全球信息
史上最深深海救援!观光潜艇失联:搜救无进展 氧气剩不多、或卡残骸中|全球讯息
公募基金派发约八百亿元“红包雨” 债基占比超八成
俄妹COS《塞尔达》公主火了 性感美艳:欧美曾呼吁塞尔达公主应黑人|时快讯
环球热文:破75%了!理想汽车家用交流充电桩安装率遥遥领先
比亚迪赵长江:腾势N7领先两代 将成为家用和年轻人首选大五座标杆SUV
全球短讯!年轻人第一辆车!“小米汽车”非官方渲染图又来了:质感拉满 你会买吗
读发布!设计与部署稳定的分布式系统(第2版)笔记07_线程阻塞_每日速递
每日看点!从0开始,手写MySQL事务
MySQL事务基础知识 世界快资讯
世界即时:AMD Zen4c 128核心偷跑:只要4万元 不到官价一半
游客新疆旅游拍下雪崩全过程:壮观至极 众人尖叫_世界热文
【环球新视野】孟晚舟亲自站台!华为新杀手锏能否打破国际垄断?
耶鲁大学华裔学生驾车身亡:父母获赔2.5亿元_世界通讯
全球快看点丨观光泰坦尼克号潜艇失联:将是史上最深深海救援 将近4000米
手机可拆卸电池即将回归 利大于弊?
霍启刚患上睡眠窒息症:会被自己打鼾声惊醒 医生称严重会猝死-全球快看
今日报丨北京市下周一通过柜台市场发行20亿元3年期地方债券
每日热闻!5人宿舍热3年用掉水费5275元 高校回应:还算正常 个人习惯不同
世界快讯:618全网销售总额增速降至近3年最低:总销售额7987亿元创新高
ARP与dns缓存攻击 --中间人攻击
文心一言 VS 讯飞星火 VS chatgpt (43)-- 算法导论5.4 7题
用Python写了一个「拥抱梅西」的小游戏
天天时讯:证监会:券商应规范开立综合账户 加强异常交易监测
女子称网购八喜冰淇淋发现少10g:客服赔付了500元
腾讯视频VIP年卡+京东PLUS年卡 双会员仅138元
17万买纯电7座 2024款AION V Plus上市:更有AI的家庭SUV 每日资讯
环球速看:百公里油耗仅需6.1L !全新问界m5曝光:或售价25万起
期望误差和经验误差的关系——期望误差上界
【焦点热闻】使用python对AWS-CloudTrail-Json-日志文件key字段名称的提取
天天日报丨决战暑期档!国产航空大片《长空之王》密钥再次延期:王一博主演
超越姚明!16岁女篮小将身高已达2米27 山东女篮主力 单场曾砍62分
国产显卡第一次!摩尔线程发布DX11社区版驱动 能玩5款游戏_世界聚焦
全球观焦点:价格跌倒iPhone吃饱!被群嘲的苹果竟成为618销冠
不再依赖进口锂矿 两款钠离子电池电动车来了:成本便宜30%
天天快消息!记录--前端实现文件预览(pdf、excel、word、图片)
InnoDB 内存结构之更改缓冲区 环球新消息
Springboot web,三层架构, IOC&DI 使用总结2023 关注
快讯 | ShowMeBug入选人力资源智享会《TPG红宝书》 观热点
精彩看点:中消协出手:反对扫码强制关注公众号 全国范围可举报
学生自掏30万拍作品:因获三等奖嫌低拒绝领奖_热文
号称性能最强轻薄掌机:AYANEO预热新AMD 7840U处理器掌机_天天即时看
210元大额券:礼盒装红蜻蜓男士真皮自动皮带49元大促_环球新资讯