志在指尖
用双手敲打未来

C# 如何提前结束 Sleep ?

良久没有更新博客了,都有点对不起这个账号了。这次跟大家分享的是一种编程思绪,没什么技术含量,但或许能帮得到你。
我们经常会在程序程序中用到Sleep这个办法。Sleep办法用起来十分简单,但是有个问题,就是假如Sleep时间过长,忽然想完毕Sleep,似乎没有什么好的方法,至少目前我是不晓得有什么比拟直接的方法。当然我这里有个间接的方法。
我们都晓得在Sleep的参数是毫秒级别的,而我们用的最多的是秒级别的挂起当前线程,也就是说根本都是给参数值乘以1000来到达秒级。那好我们就应用一下这个一点来转换下思绪来完成提早完毕Sleep。
其实思绪很简单就是大值化小。比方参数是1000,我们能够转换为100(份)*10(基数)。转为代码根本就是100*Sleep(10)。C#
经过稍加修饰的封装,中心代码如下:
复制代码
1publicsealedclassMySleep
2{
3privatevolatilebool_isSleep=true;
4
5publicvoidOver()
6{
7_isSleep=false;
8}
9
10publicvoidSleep(intms)
11{
12constintbaseTime=10;
13
14if(ms<baseTime)
15{
16System.Threading.Thread.Sleep(ms);
17}
18else
19{
20intloopCount=ms/baseTime;//除以baseTime,代表是baseTime毫秒的几倍
21intsurplusMS=ms%baseTime;//剩余毫秒数
22
23while(_isSleep&&loopCount>0)
24{
25System.Threading.Thread.Sleep(baseTime);
26–loopCount;
27}
28
29if(_isSleep&&surplusMS>0)
30{
31System.Threading.Thread.Sleep(surplusMS);
32}
33}
34}
35}
复制代码
调用示例:
复制代码
1staticvoidMain(string[]args)
2{
3varmySleep=newMySleep();
4System.Threading.Tasks.Task.Factory.StartNew(()=>
5{
6Console.WriteLine(“{0}:Sleepbegin.”,DateTime.Now.ToString(“yyyy-MM-ddHH:mm:ss.fff”));
7Stopwatchsw=newStopwatch();
8sw.Start();
9mySleep.Sleep(10000);
10sw.Stop();
11Console.WriteLine(“{0}:Sleepend.”,DateTime.Now.ToString(“yyyy-MM-ddHH:mm:ss.fff”));
12Console.WriteLine(“Totalsleep{0}ms”,sw.ElapsedMilliseconds);
13});
14
15Console.WriteLine(“Pressanykeytostopsleepnow.”);
16Console.ReadKey();
17mySleep.Over();
18
19Console.WriteLine(“Pressanykeytoclosetheapplication.”);
20Console.ReadKey(true);
21}
复制代码
不提早终止效果:
提早完毕Sleep效果:
以上办法根本到达提早完毕Sleep的下效果。不过在运转期间会产生一些误差,比方baseTime越小,那么产生的循环指令就会越多,误差就会越大,但是会进步终止的效率。所以这一点需求本人略微均衡下。不过我置信,更好的方法会在评论区呈现。等待各位大神的留言。
那么问题来了。既然用了Sleep就是为了挂起当前线程,为什么又要提早终止呢?或者什么样的场景需求这样的操作呢?评论区欢送你的留言。

未经允许不得转载:IT技术网站 » C# 如何提前结束 Sleep ?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载