C# 如何提早结束 Sleep ?

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

  咱们常常会在程序程序中用到 Sleep 这个方法。Sleep 方法用起来很是简单,可是有个问题,就是若是 Sleep 时间过长,忽然想结束 Sleep,彷佛没有什么好的办法,至少目前我是不知道有什么比较直接的办法。固然我这里有个间接的办法。app

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

  其实思路很简单就是大值化小。好比参数是 1000,咱们能够转换为 100(份) * 10(基数)。转为代码基本就是 100 * Sleep(10)。spa

  通过稍加修饰的封装,核心代码以下:pwa

 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         }

不提早终止效果:code

提早结束 Sleep效果:blog

以上方法基本达到提早结束 Sleep 的下效果。不过在运行期间会产生一些偏差,好比 baseTime 越小,那么产生的循环指令就会越多,偏差就会越大,可是会提升终止的效率。因此这一点须要本身稍微平衡下。不过我相信,更好的办法会在评论区出现。期待各位大神的留言。博客

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

相关文章
相关标签/搜索