好久没有更新博客了,都有点对不起这个账号了。这次跟大家分享的是一种编程思路,没什么技术含量,但也许能帮得到你。

  我们经常会在程序程序中用到 Sleep 这个方法。Sleep 方法用起来非常简单,但是有个问题,就是如果 Sleep 时间过长,突然想结束 Sleep,似乎没有什么好的办法,至少目前我是不知道有什么比较直接的办法。当然我这里有个间接的办法。

  我们都知道在 Sleep 的参数是毫秒级别的,而我们用的最多的是秒级别的挂起当前线程,也就是说基本都是给参数值乘以 1000 来达到秒级。那好我们就利用一下这个一点来转换下思路来实现提前结束 Sleep。

  其实思路很简单就是大值化小。比如参数是 1000,我们可以转换为 100(份) * 10(基数)。转为代码基本就是 100 * Sleep(10)。

  经过稍加修饰的封装,核心代码如下:

     public sealed class MySleep
{
private volatile bool _isSleep = true; public void Over()
{
_isSleep = false;
} public void Sleep(int ms)
{
const int baseTime = ; if (ms < baseTime)
{
System.Threading.Thread.Sleep(ms);
}
else
{
int loopCount = ms / baseTime; // 除以 baseTime,代表是 baseTime 毫秒的多少倍
int surplusMS = ms % baseTime; // 剩余毫秒数 while (_isSleep && loopCount > )
{
System.Threading.Thread.Sleep(baseTime);
--loopCount;
} if (_isSleep && surplusMS > )
{
System.Threading.Thread.Sleep(surplusMS);
}
}
}
}

  调用示例:

         static void Main(string[] args)
{
var mySleep = new MySleep();
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
Console.WriteLine("{0} : Sleep begin.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
Stopwatch sw = new Stopwatch();
sw.Start();
mySleep.Sleep();
sw.Stop();
Console.WriteLine("{0} : Sleep end.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
Console.WriteLine("Total sleep {0} ms", sw.ElapsedMilliseconds);
}); Console.WriteLine("Press any key to stop sleep now.");
Console.ReadKey();
mySleep.Over(); Console.WriteLine("Press any key to close the application.");
Console.ReadKey(true);
}

不提前终止效果:

提前结束 Sleep效果:

以上方法基本达到提前结束 Sleep 的下效果。不过在运行期间会产生一些误差,比如 baseTime 越小,那么产生的循环指令就会越多,误差就会越大,但是会提高终止的效率。所以这一点需要自己稍微平衡下。不过我相信,更好的办法会在评论区出现。期待各位大神的留言。

  那么问题来了。既然用了 Sleep 就是为了挂起当前线程,为什么又要提前终止呢?或者什么样的场景需要这样的操作呢?评论区欢迎你的留言。

C# 如何提前结束 Sleep ?的更多相关文章

  1. 通过if语句实现for循环的提前结束

    /************************************************************************* > File Name: mybreakin ...

  2. dom4j解析xml时报出文件提前结束

    在写javaweb小项目的时候,用dom4j解析xml报出如下错误: org.dom4j.DocumentException:Error    .......    Nested exception: ...

  3. python控制流-提前结束进程

    一.sys.exit() 调用 sys.exit()函数,可以让程序终止或退出. 这个函 数在 sys 模块中,必须先导入 sys,才能使用它: #!/usr/bin/env python #codi ...

  4. python通过自定义异常,提前退出方法

    python退出的操作,搜索后都是return.exit()等 return:退出一个方法,并返回一个值 exit():退出python   想要实现的功能: 方法A中调用多个方法,方法B.方法C.. ...

  5. shell脚本实现轮询查看进程是否结束

    功能需求: 一个shell脚本,为了使用多进程,启动十几个后台运行的程序,为了防止脚本比后台进程提前结束造成不可预估的影响,现要判断是否多个后台执行的已知进程已经结束,并在所有进程结束后做出相应操作. ...

  6. Thread 如何安全结束一个线程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  8. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  9. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

随机推荐

  1. [RN]react-native-scrollable-tab-view和FlatList手势冲突解决

    问题描述: react-native-scrollable-tab-view叠加react-native-scrollable-tab-view再加上FlatList FlatList向下拉时,会造成 ...

  2. [RN] Android 设备adb连接后unauthorized解决方法

    Android 设备adb连接后unauthorized解决方法 安卓设备usb或者adbwireless连接后输入adb device后都是未授权状态 相信很多同学都会遇到这种情况,除了一直重复开关 ...

  3. 洛谷P2504 [HAOI2006]聪明的猴子题解

    题目 记录悲伤 已知猴子的数量以及猴子跳的最大距离 已知数的数量以及树的坐标 最小生成树 每两棵树之间的距离需要枚举来计算 算出最大值之后再与n只猴子进行比较记录答案 需要注意 在使用最小生成树的时候 ...

  4. js中的自动包装机制

    有一行语句: 1.toString() //error 那么问题来了,为什么报错? 我的第一想法就是1是一个基本类型,所以它没有toString方法 嗯,理直气壮 接下来有大佬show me code ...

  5. MVC发布出现:未能将文件bin\xxx.xml 复制到 obj\Release\PackageTmp\bin\xxx.xml,未能找到文件

    之前写的项目好好的,也可以发布,然后今天要发布MVC项目,一直报错,报下面这个错误 莫名其妙搞了好久,没搜到合理的解决方案,结果就只能瞎搞了. 突然想起了,我前几天犯贱把项目根目录下的bin文件夹和o ...

  6. hive 批量添加,删除分区

    一.批量添加分区:   use bigdata; alter table siebel_member add if not exists partition(dt='20180401') locati ...

  7. 谨记不要在MySQL中使用“utf8”编码

    掉坑回顾: 最近在工作中遇到一个BUG,用于记录客户昵称的数据表,在插入带有表情的字符时候报错.使用的存储引擎是INNODB,当我查看数据库字段的时候确实是设置的utf8,我传入的字符也是utf8的编 ...

  8. (Manjaro)VirtualBox异常修复:RTR3InitEx failed with rc=-1912 (rc=-1912)

    引言 VirtualBox运行异常好几天,其中尝试一些操作都没有解决. 版本说明 系统版本:4.19.88-1-MANJARO Vbox镜像:kali-linux-2019.4-vbox-amd64. ...

  9. zabbix4.0 本地安装详解及步骤

    安装前说明下,下面安装过程中涉及selinux部分仅供参考,可能会导致启动服务时产生各种报错,作者也是在折腾了无数日夜后报错不断而放弃治疗,直接永久关闭了selinux(啊,没有selinux的日子真 ...

  10. 字符串格式连接sqlserver数据库的字段概念解释

    以连接sqlserver数据库举例说明如:“Provider=SQLOLEDB.1;Password=******;Persist Security Info=True;User ID=sa;Init ...