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

相關文章
相關標籤/搜索