目录

介绍

使用代码

兴趣点


经常发现需要在代码执行中添加暂停,乍一看远程目标或文件可能尚未准备好,所以您退后一段时间再试一次,重复执行直到目标准备好或过程被取消。在这种情况下,很容易放入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相关推荐

  1. 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?

    作者:Yujiaao 来源:segmentfault.com/a/1190000019962661 一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢?需要对 J ...

  2. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中

    多线程概述 Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作 ...

  3. Java - 为什么等待和通知是在Object类而不是Thread中声明的?

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 以下是我认为有意义的一些想法: 1.wait和not ...

  4. thread.sleep是让哪个线程休眠_Java多线程:多线程基础知识

    点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:https://www.cnblogs.com/ITtangtang/p/7602363.html 一.线程安全 ...

  5. Thread.currentThread()、isAlive()、Thread.sleep()的使用

    1.Thread.currentThread()方法: 返回当前正在运行的线程 一个简单的例子: MyThread_7.Java类的构造函数是被main线程调用的,而run()方法是被名为Thread ...

  6. java sleep 抛出异常_PowerMockito模拟Thread.sleep()时抛出中断异常的场景

    点击蓝色字免费订阅,每天收到这样的好信息 前言:最近有不少粉丝关注本公众号.并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧.大家想买什 ...

  7. 启动线程时使用 start 而不是 run

    今天团队里面的妹子问阿粉,为什么在启动线程的时候,都使用 start 方法,而不是 run 方法呢 还好阿粉平时一直有在学习,要不真的被妹子问住了 在多线程中,如果想让一个线程启动,你使用的方法一定是 ...

  8. 1.使用Runnable和Thread完成线程创建和基本操作

    利用<倚天屠龙记>中光明顶之战来完成线程的创建及线程的基本操作 GuangMingDing.java:舞台线程 HeroThread.java:六大门派线程 SchoolRunnable. ...

  9. .NET 异步,你也许不知道的5种用法

    async/await异步操作,是C#中非常惊艳的"语法糖",让异步编程变得优美且傻瓜化到了不可思议的程度.就连JavaScript都借鉴了async/await语法,让回调泛滥的 ...

最新文章

  1. 硬盘FAT32转NTFN格式的命令
  2. python坐标系转换函数_Numpy-坐标系之间的转换
  3. 简谈Redis的线程模型
  4. 跟我一起学.NetCore之Asp.NetCore启动流程浅析
  5. 一文带你了解如何打造持续学习文化
  6. 算法工程师,『工程』二字怎么破?
  7. 网络编程(三)--通信循环、链接循环、粘包问题
  8. 答案--Java面试笔试题(3年以上)
  9. Java后端根据身份证号计算年龄
  10. Gimp去除图片背景色方法
  11. poj 3295 Tautology
  12. 将Hexo个人博客部署到个人云服务器--最详细踩坑教程
  13. 非看不可的实用技巧:在Mac上使用密码保护文件夹!
  14. 关于2021年11月28日PMI认证考试的报名通知
  15. int和long类型取值范围。 基本数据类型 byte , short , char ,int , long , float ,double,boolean类型取值范围
  16. 2020算法面经问题汇总
  17. 贝叶斯统计推断(一)
  18. curl php 宝塔 开启_宝塔安装php失败
  19. echarts自定义视图数据(dataView)
  20. [论文阅读笔记17]A Survey on Knowledge Graph-Based Recommender Systems

热门文章

  1. 电脑java语言有什么用_Java语言是什么?_Java语言有什么优点
  2. tkinter使用cefpython库_Python3.7 tkinter中嵌入网页(WebView),需要引入cefpython3
  3. 成毅高清电脑桌面壁纸
  4. 高图壁纸网站,承包了你一年的电脑壁纸
  5. 惊喜!想要高清背景壁纸图片素材,看这里
  6. 冬季美食不可少烤肉和火锅,最具诱惑的手绘肉食插画素材,让设计师勾引你的味蕾
  7. 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
  8. java拥有键值对的数据结构_Java数据结构之004--HashMap
  9. SU(Seismic Unix)与CUDA的混合编程
  10. Live CD|ISO