使用CancellationToken——而不是Thread.Sleep
目录
介绍
使用代码
兴趣点
经常发现需要在代码执行中添加暂停,乍一看远程目标或文件可能尚未准备好,所以您退后一段时间再试一次,重复执行直到目标准备好或过程被取消。在这种情况下,很容易放入Thread.Sleep(n)——但这不会响应取消触发器,所以为什么不使用CancellationToken呢?
- 下载源代码-10.9 KB
介绍
不久前,我被要求查看一项服务,该服务间歇性地在停止和关闭操作上生成异常。
该服务本身是一个简单的设备管理组件,它使用一个任务在启动时连接到远程设备,进行一些更新,仅此而已。但是,当尝试进行连接时,目标设备并不总是准备就绪,因此使用了while循环,并以调用Thread.Sleep(20000)的形式插入了暂停。
在再次尝试之前将任务暂停20秒的想法很合理——但是20秒线程块会间歇性地(取决于时间)导致服务管理器由于触发关闭或停止超时而强制关闭服务,由此产生的异常将填满日志。
Thread.Sleep(n)无法取消——请考虑使用CancellationToken.WaitHandle.WaitOne(n)。
使用代码
本技巧中的代码是Thread.Sleep和CancellationToken.WaitHandle.WaitOne在任务中的行为的一个小示例,您可以对其进行试验
服务中实现的原始while循环如下所示:
while (!cancellationToken.IsCancellationRequested)
{// Processingif(connectionReady){// Do its businessbreak;}// Pause for 20 seconds before trying againThread.Sleep(20000);
}
在此实现中,线程将被阻塞20秒——不管是否有任何取消触发器。这是潜在的问题——根据与Thread.Sleep调用有关的停止操作的时间,服务管理器将使停止操作超时并强行终止管理服务。
暂停执行代码,但知道取消请求很简单:
while (!cancellationToken.IsCancellationRequested)
{ // Processingif(connectionReady){// Do its businessbreak;}// Pause for 20 seconds before trying again - now with cancellation supportvar cancellationTriggered = cancellationToken.WaitHandle.WaitOne(20000);
}
这一行更改实现了与原始实现相同的20秒暂停,并且它也知道任务取消。
兴趣点
如果您发现到处都在使用Thread.Sleep(n),请考虑改为使用CancellationToken.WaitHandle.WaitOne(n)方法。这将有助于保持异常记录的大小。
使用CancellationToken——而不是Thread.Sleep相关推荐
- 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?
作者:Yujiaao 来源:segmentfault.com/a/1190000019962661 一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢?需要对 J ...
- 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
多线程概述 Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作 ...
- Java - 为什么等待和通知是在Object类而不是Thread中声明的?
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 以下是我认为有意义的一些想法: 1.wait和not ...
- thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识
点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:https://www.cnblogs.com/ITtangtang/p/7602363.html 一.线程安全 ...
- Thread.currentThread()、isAlive()、Thread.sleep()的使用
1.Thread.currentThread()方法: 返回当前正在运行的线程 一个简单的例子: MyThread_7.Java类的构造函数是被main线程调用的,而run()方法是被名为Thread ...
- java sleep 抛出异常_PowerMockito模拟Thread.sleep()时抛出中断异常的场景
点击蓝色字免费订阅,每天收到这样的好信息 前言:最近有不少粉丝关注本公众号.并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧.大家想买什 ...
- 启动线程时使用 start 而不是 run
今天团队里面的妹子问阿粉,为什么在启动线程的时候,都使用 start 方法,而不是 run 方法呢 还好阿粉平时一直有在学习,要不真的被妹子问住了 在多线程中,如果想让一个线程启动,你使用的方法一定是 ...
- 1.使用Runnable和Thread完成线程创建和基本操作
利用<倚天屠龙记>中光明顶之战来完成线程的创建及线程的基本操作 GuangMingDing.java:舞台线程 HeroThread.java:六大门派线程 SchoolRunnable. ...
- .NET 异步,你也许不知道的5种用法
async/await异步操作,是C#中非常惊艳的"语法糖",让异步编程变得优美且傻瓜化到了不可思议的程度.就连JavaScript都借鉴了async/await语法,让回调泛滥的 ...
最新文章
- 硬盘FAT32转NTFN格式的命令
- python坐标系转换函数_Numpy-坐标系之间的转换
- 简谈Redis的线程模型
- 跟我一起学.NetCore之Asp.NetCore启动流程浅析
- 一文带你了解如何打造持续学习文化
- 算法工程师,『工程』二字怎么破?
- 网络编程(三)--通信循环、链接循环、粘包问题
- 答案--Java面试笔试题(3年以上)
- Java后端根据身份证号计算年龄
- Gimp去除图片背景色方法
- poj 3295 Tautology
- 将Hexo个人博客部署到个人云服务器--最详细踩坑教程
- 非看不可的实用技巧:在Mac上使用密码保护文件夹!
- 关于2021年11月28日PMI认证考试的报名通知
- int和long类型取值范围。 基本数据类型 byte , short , char ,int , long , float ,double,boolean类型取值范围
- 2020算法面经问题汇总
- 贝叶斯统计推断(一)
- curl php 宝塔 开启_宝塔安装php失败
- echarts自定义视图数据(dataView)
- [论文阅读笔记17]A Survey on Knowledge Graph-Based Recommender Systems
热门文章
- 电脑java语言有什么用_Java语言是什么?_Java语言有什么优点
- tkinter使用cefpython库_Python3.7 tkinter中嵌入网页(WebView),需要引入cefpython3
- 成毅高清电脑桌面壁纸
- 高图壁纸网站,承包了你一年的电脑壁纸
- 惊喜!想要高清背景壁纸图片素材,看这里
- 冬季美食不可少烤肉和火锅,最具诱惑的手绘肉食插画素材,让设计师勾引你的味蕾
- 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
- java拥有键值对的数据结构_Java数据结构之004--HashMap
- SU(Seismic Unix)与CUDA的混合编程
- Live CD|ISO