• C# 如何提前结束 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 就是为了挂起当前线程,为什么又要提前终止呢?或者什么样的场景需要这样的操作呢?评论区欢迎你的留言。

  • 相关阅读:
    [GCJ2017R2]Fresh Chocolate
    李耀于NOIP2010集训出的题 Dvalue
    POI ZAW
    POI SZP
    無名(noname)
    幸运序列(lucky)
    [HNOI2001]求正整数
    灰狼呼唤着同胞(brethren)
    神在夏至祭降下了神谕(oracle)
    [bzoj 4237] 稻草人
  • 原文地址:https://www.cnblogs.com/hjsstudio/p/11144629.html
Copyright © 2020-2023  润新知