最新要闻
- Wii U和3DS在线游戏商店关闭前:玩家花15万328天买下所有游戏
- 2022年 全国坐火车的少了36.4%!高铁已达4.2万公里
- 日本东电直播用核污水养鱼 海外网友直言:留着自己吃吧
- 环球热点评!旗舰级LCD护眼屏+120W独此一款!iQOO Z7发布:1599元
- 全球热议:6000mAh同档位续航无敌!iQOO Z7x发布:1299元起
- 便宜卡终于有了!好队友抢跑:RTX 4070/4060来也
- 9999元 AOC爱攻新款48寸显示器上架:4K OLED屏、138Hz高刷
- 当前快讯:死亡细胞将登陆Android端
- 【世界新视野】抗早泄药物盐酸达泊西汀国内正式上市:效果最好!订单超4000万元
- 天天通讯!1994《小美人鱼》vs2023《小美人鱼》对比图火了:5月上映 你会看吗?
- 焦点消息!LCD党最好的选择!iQOO Z7定制旗舰级LCD屏:超级护眼
- 今日热闻!神秘光点划过美国加州夜空 专家:或为日本太空垃圾
- 【世界新要闻】正式签约石墨烯之父 超威电池三大单品发布
- 网传凯迪拉克中控屏行驶中弹窗广告 车主:烦死了
- 热点!多益网络:前女高管们利用网络水军造假 导致公司损失5亿元
- 全球即时看!速干短袖+短裤:骆驼运动套装79元狂促(300元大额券)
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
C# 探秘如何优雅的终止线程
在刚接触后台线程的时候,觉得线程神秘且高深,并且时常有先辈们千叮万嘱:能不用的时候,尽量不要用,千万不要滥用线程,否则会发生预料不到的结果。在接触线程一段时间后,感觉线程也不过如此,轻而易举的就可以创建,所以逐渐大胆起来,项目里随处可见的都是Task,Thread,async,await等内容。在大多情况下,我们只关心线程的创建与启动,运行,却并不关心线程的结束或者终止。今天这篇文章,我们就以一些简单的小例子,简述如何有效的停止线程,仅供学习分享使用,如有不足之处,还请指正。
需求说明
现在有一个需求:有一个后台线程,定时(300ms)输出一段内容,但不希望它一直运行,所以设置了超时时间(3s),希望在超时结束后,便执行后续的内容。
初始版本
根据需求,开发了第一个版本的代码,步骤如下:
【资料图】
- 定义一个Task。
- 在Task内,运行死循环,每间隔300毫秒,输出一段内容。
- 设置Task的等待超时时间,超时结束后,运行后续内容。
具体代码如下所示:
1 namespace DemoTask 2 { 3 internal class Program 4 { 5 static void Main(string[] args) 6 { 7 TestTask(); 8 Console.ReadKey(); 9 }10 11 ///12 /// 测试任务13 /// 14 public static void TestTask()15 {16 Console.WriteLine("程序开始.");17 var task = Task.Run(() =>18 {19 while (true)20 {21 Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在运行...");22 Thread.Sleep(300);23 }24 });25 task.Wait(3000);26 Console.WriteLine("程序超时结束.");27 }28 }29 }
信心满满的运行程序,但是期待的结果并没有出现,在超时时间后,并没有预期的停止任务,反而在继续运行。如下所示:
注意:通过以上程序发现,Wait方法只是等待时间结束后不再等待,但是原有任务并未结束,而是继续运行。
进阶版本
为了解决线程无法结束的问题,微软官方给出的方案是采用CancellationTokenSource,向应该被取消的线程发送信号。即在线程内部判断是否收到取消请求,在外部发起取消请求信号。步骤如下:
- 定义一个Task。
- 在Task内,当没有收到取消信号时,每间隔300毫秒,输出一段内容。
- 设置Task的等待超时时间,超时结束后,发起取消信号,并运行后续内容。
具体代码如下所示:
1 ///2 /// 测试任务 3 /// 4 public static void TestTask() 5 { 6 Console.WriteLine("程序开始."); 7 CancellationTokenSource cts = new CancellationTokenSource(); 8 CancellationToken token = cts.Token; 9 var task = Task.Run(() =>10 {11 while (!token.IsCancellationRequested)12 {13 Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在运行...");14 Thread.Sleep(300);15 }16 });17 bool flag = task.Wait(3000);18 if (!flag) { 19 cts.Cancel();20 }21 Console.WriteLine("程序超时结束.");22 }
优化程序后,运行程序如下所示:
注意:经过以上程序优化后,确实是如预想的结果一致,程序在等待超时时间后,停止了运行。
最终版本
正常情况下,如果是我们自己开发的程序,程序到第二个版本就已经解决问题了,但是假如While循环的内容是第三方提供的程序,已经封装为固定模块,我们无法进行修改,那应该如何才能终止死循环呢?如何才能像任务管理器结束进程一样,结束这一直无休止运行的程序呢?
为了解决我们的难题,对程序进行进一步的优化,步骤如下:
- 定义一个Task。
- 在Task内,注册线程的Abort方法,在未调用Abort方法时,每间隔300毫秒,输出一段内容。
- 设置Task的等待超时时间,超时结束后,发起取消信号,并运行后续内容。
具体代码如下所示:
1 ///2 /// 测试任务 3 /// 4 public static void TestTask() 5 { 6 Console.WriteLine("程序开始."); 7 CancellationTokenSource cts = new CancellationTokenSource(); 8 CancellationToken token = cts.Token; 9 var task = Task.Run(() =>10 {11 using (token.Register((Thread.CurrentThread.Abort)))12 {13 //假设以下内容第3方提供,无法修改14 while (true)15 {16 Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在运行...");17 Thread.Sleep(300);18 }19 //以上内容第3方提供20 }21 });22 bool flag = task.Wait(3000);23 if (!flag)24 {25 cts.Cancel();26 }27 Console.WriteLine("程序超时结束.");28 }
优化程序后,运行程序如下所示:
以上就是我们对后台服务线程的终止问题的探索,解决问题的方式还有很多,希望本篇文章可以抛砖引玉,一起学习,共同进步。
关键词:
-
焦点播报:Spring IOC官方文档学习笔记(十四)之ApplicationContext的其他功能
1 使用MessageSource(1)有时,我们的项目可能会面临国际化需求,例如:对不同国家的人,我们需返回不同...
来源: C# 探秘如何优雅的终止线程
行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
焦点播报:Spring IOC官方文档学习笔记(十四)之ApplicationContext的其他功能
如何上传一个npm包
中债金融终端上线“货币经纪行情”功能
瑞信风波由股及债 此前已有分析师提示“AT1”风险
Wii U和3DS在线游戏商店关闭前:玩家花15万328天买下所有游戏
2022年 全国坐火车的少了36.4%!高铁已达4.2万公里
环球热点!基于深度学习的口罩检测系统(Python+清新界面+数据集)
【环球新视野】自律|坚持,是因为不喜欢
Java内部类笔记整理
全球快资讯丨永磁同步电机驱动系统—相关方向思考
焦点要闻:HTTP 状态码与课程总结
日本东电直播用核污水养鱼 海外网友直言:留着自己吃吧
环球热点评!旗舰级LCD护眼屏+120W独此一款!iQOO Z7发布:1599元
全球热议:6000mAh同档位续航无敌!iQOO Z7x发布:1299元起
便宜卡终于有了!好队友抢跑:RTX 4070/4060来也
9999元 AOC爱攻新款48寸显示器上架:4K OLED屏、138Hz高刷
当前快讯:死亡细胞将登陆Android端
环球快看点丨波动数列
瑞银收购瑞信意外“引爆”AT1债券市场 对冲基金不计成本抛售避险
【世界新视野】抗早泄药物盐酸达泊西汀国内正式上市:效果最好!订单超4000万元
天天通讯!1994《小美人鱼》vs2023《小美人鱼》对比图火了:5月上映 你会看吗?
焦点消息!LCD党最好的选择!iQOO Z7定制旗舰级LCD屏:超级护眼
今日热闻!神秘光点划过美国加州夜空 专家:或为日本太空垃圾
【世界新要闻】正式签约石墨烯之父 超威电池三大单品发布
世界今热点:Python+selenium安装
全球即时看!【财经分析】“降准”落地利好信用债阶段表现 中期仍需关注多因素扰动风险
网传凯迪拉克中控屏行驶中弹窗广告 车主:烦死了
热点!多益网络:前女高管们利用网络水军造假 导致公司损失5亿元
全球即时看!速干短袖+短裤:骆驼运动套装79元狂促(300元大额券)
戴森空气净化耳机首发体验:6699元图一乐?
美知名媒体曝特斯拉大量负面:自动驾驶测试作假
焦点速看:这些AIGC工具有趣且实用
abc294G
设计原则
观热点:也等你 [表白墙] 发布!
天天即时:泰格医药董事ZHUAN YIN累计减持7.6万股 减持期限届满
【独家焦点】债市日报:3月20日
每日看点!爆火情侣竟不是真人!新版Midjourney效果爆炸 网友:太可怕了
全球即时看!宏碁搞“副业”?推出电动自行车Acer ebii:110公里超长续航
男子2年未办理个税汇算 被查后补税加罚金近10万
世界资讯:梦想和高薪你会如何选择?00后女生10秒拒绝8家公司
Microsoft Project教程_编程入门自学教程_菜鸟教程-免费教程分享
环球热头条丨Source Generator-扩充原有代码
8个不能错过的程序员必备网站,惊艳到我了!!!
即时焦点:瑞信全面减记AT1债券影响扩大 日债收益率午后全线下挫
新动态:令人血压飙升!一SUV高速快车道停车致多车连撞:后果惨烈
【世界播资讯】毕业典礼学校安排学生在操场吃席:画面仪式感拉满
环球焦点!宁德一家利润超韩国三大厂商 韩系电池厂商绝望:高端低端都打不过
全球观热点:《黑暗荣耀》全剧出现119次韩语粗口:韩剧总是那么吵!
观点:腾讯发布2022研发大数据报告:内部研发人员占比高达74%
【MySQL】InnoDB vs MyISAM
etcd 租约、Watch功能、分布式锁的golang实践
天天资讯:【工作动态】以培训促提升——医疗机构药品器械管理规范培训会
全球今头条!农垦系统继续开展带头扩种大豆油料行动
环球观速讯丨终于!清华团队的ChatGPT发布:国人用起来相当友好
网红阿秋将离开香港继续骑行:被盗走的8000元自行车仍未找回
即时焦点:男孩雷克萨斯4S店内开动展车连撞两车 律师:家长、店方都有责任
语音+App远程操控!天猫精灵智能插座探底好价:两件34元
当前播报:韩国40出头新娘人数比20岁还多:初婚男女平均年龄均创新高
【世界新要闻】华为交换机查看配置命令的方法
全球快讯:关于国产项目Apache Kylin 发展历程及背后的那些事
今热点:概率与期望入门
环球最新:通过python3启动WEB的方法传输文件
世界聚焦:chrony客户端发送时间戳随机问题
每日热点:混凝土强度两倍!科学家发明火星建屋材料:太空尘埃、土豆淀粉制成
你觉得是谁?博主称某日系合资品牌即将退出国内市场
要闻:不废话 真低价!途虎养车2023轮胎节启动:几百元能买静音胎
对标ChatGPT!文心一言云服务来了:百度官宣3月27日上线
主场比赛姆巴佩两失单刀:梅西多次妙传被浪费
世界快消息!jvm相关知识
全球观焦点:易基因:DNA甲基化研究的3大前期探索性实验思路|干货系列
全球报道:光大证券:LPR还将继续保持平稳
环球精选!迪士尼回应游客排挤玲娜贝儿演员:将核实处理 网友吐槽饭圈行为
女子骑电动车导航跑上高架一路逆行:不知道不能上高架
sd卡根目录是什么意思?sd卡根目录在哪里打开?
惠普的驱动程序在哪个文件夹?惠普sd驱动怎么下载?
高能少年团许魏洲抱杨紫是哪一期?高能少年团第二季为什么少了两期?
周杰为哪部奥特曼作品中配过音?周杰个人资料和简历
厨师罗拉是哪里人?厨师罗拉个人资料简介
每日精选:汽车脚垫天花板!男子直接在车内铺瓷砖:耐磨还方便打理
【世界速看料】小伙求加薪被拒将老板工程车弃河:松离合跳车、致损失27万
全球微资讯!女子点螺蛳粉外卖吃出整根蚯蚓 商家称其想吃霸王餐
多车企疯狂大降价 德国媒体:中国车市从没这么卷过
天天观天下!特斯拉高速行驶中AP突然关闭 方向盘助力诡异消失
最新资讯:ChatGPT4高分通过数据库系统工程师(DBA)认证
天天速读:瓦斯琪尔的任务_瓦斯琪尔前置任务
全球速读:女子超市遇电动购物车:30分钟5块钱!网友:比公园划船划算
最资讯丨文章抹黑造谣?特斯拉索赔500万元被判胜诉!媒体不服上诉
焦点!一部车骑十年 回顾绿源液冷电机发展史:三年创下吉尼斯世界纪录
交易履约之产品中心实践
天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
【世界热闻】Python工具箱系列(二十七)
python高级用法之命名元组namedtuple
【世界速看料】大学生23万网购凯迪拉克二手车:开了俩月就冒烟 三大件全动过
499元 小米真无线降噪耳机3星战定制款发布:风暴兵标志太酷炫
每日快讯!ChatGPT推荐中国最宜居城市 成都第三长沙第一 认可吗
焦点!斗鱼回应36岁女子请假保胎被辞:并非针对孕妇 不服可仲裁
2.8K 120Hz华硕好屏、升级13代酷睿!灵耀14 2023旗舰版图赏