当前位置: 移动技术网 > IT编程>开发语言>.net > C# 如何提前结束 Sleep ?

C# 如何提前结束 Sleep ?

2019年07月07日  | 移动技术网IT编程  | 我要评论

宋小宝小品全集,qvod 艺术片,风瘙痒女人图片

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

  我们经常会在程序程序中用到 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 就是为了挂起当前线程,为什么又要提前终止呢?或者什么样的场景需要这样的操作呢?评论区欢迎你的留言。

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网