C# 如何提前结束 Sleep ?
程序员文章站
2023-11-06 10:22:04
好久没有更新博客了,都有点对不起这个账号了。这次跟大家分享的是一种编程思路,没什么技术含量,但也许能帮得到你。 我们经常会在程序程序中用到 Sleep 这个方法。Sleep 方法用起来非常简单,但是有个问题,就是如果 Sleep 时间过长,突然想结束 Sleep,似乎没有什么好的办法,至少目前我是不 ......
好久没有更新博客了,都有点对不起这个账号了。这次跟大家分享的是一种编程思路,没什么技术含量,但也许能帮得到你。
我们经常会在程序程序中用到 sleep 这个方法。sleep 方法用起来非常简单,但是有个问题,就是如果 sleep 时间过长,突然想结束 sleep,似乎没有什么好的办法,至少目前我是不知道有什么比较直接的办法。当然我这里有个间接的办法。
我们都知道在 sleep 的参数是毫秒级别的,而我们用的最多的是秒级别的挂起当前线程,也就是说基本都是给参数值乘以 1000 来达到秒级。那好我们就利用一下这个一点来转换下思路来实现提前结束 sleep。
其实思路很简单就是大值化小。比如参数是 1000,我们可以转换为 100(份) * 10(基数)。转为代码基本就是 100 * sleep(10)。
经过稍加修饰的封装,核心代码如下:
1 public sealed class mysleep 2 { 3 private volatile bool _issleep = true; 4 5 public void over() 6 { 7 _issleep = false; 8 } 9 10 public void sleep(int ms) 11 { 12 const int basetime = 10; 13 14 if (ms < basetime) 15 { 16 system.threading.thread.sleep(ms); 17 } 18 else 19 { 20 int loopcount = ms / basetime; // 除以 basetime,代表是 basetime 毫秒的多少倍 21 int surplusms = ms % basetime; // 剩余毫秒数 22 23 while (_issleep && loopcount > 0) 24 { 25 system.threading.thread.sleep(basetime); 26 --loopcount; 27 } 28 29 if (_issleep && surplusms > 0) 30 { 31 system.threading.thread.sleep(surplusms); 32 } 33 } 34 } 35 }
调用示例:
1 static void main(string[] args) 2 { 3 var mysleep = new mysleep(); 4 system.threading.tasks.task.factory.startnew(() => 5 { 6 console.writeline("{0} : sleep begin.", datetime.now.tostring("yyyy-mm-dd hh:mm:ss.fff")); 7 stopwatch sw = new stopwatch(); 8 sw.start(); 9 mysleep.sleep(10000); 10 sw.stop(); 11 console.writeline("{0} : sleep end.", datetime.now.tostring("yyyy-mm-dd hh:mm:ss.fff")); 12 console.writeline("total sleep {0} ms", sw.elapsedmilliseconds); 13 }); 14 15 console.writeline("press any key to stop sleep now."); 16 console.readkey(); 17 mysleep.over(); 18 19 console.writeline("press any key to close the application."); 20 console.readkey(true); 21 }
不提前终止效果:
提前结束 sleep效果:
以上方法基本达到提前结束 sleep 的下效果。不过在运行期间会产生一些误差,比如 basetime 越小,那么产生的循环指令就会越多,误差就会越大,但是会提高终止的效率。所以这一点需要自己稍微平衡下。不过我相信,更好的办法会在评论区出现。期待各位大神的留言。
那么问题来了。既然用了 sleep 就是为了挂起当前线程,为什么又要提前终止呢?或者什么样的场景需要这样的操作呢?评论区欢迎你的留言。