问题描述
Thread.Sleep(1);Thread.Sleep(10);Thread.Sleep(100);Thread.Sleep(1000);的实际效果为什么不是暂停1ms、10ms、100ms、1000ms呢?privatevoidbutton_DJQiDong_Click(objectsender,EventArgse){label0.Text=DateTime.Now.ToString()+":"+DateTime.Now.Millisecond.ToString();Thread.Sleep(1);label1.Text=DateTime.Now.ToString()+":"+DateTime.Now.Millisecond.ToString();Thread.Sleep(10);label10.Text=DateTime.Now.ToString()+":"+DateTime.Now.Millisecond.ToString();Thread.Sleep(100);label100.Text=DateTime.Now.ToString()+":"+DateTime.Now.Millisecond.ToString();Thread.Sleep(1000);label1000.Text=DateTime.Now.ToString()+":"+DateTime.Now.Millisecond.ToString();}为什么暂停了15ms、16ms、109ms和1000ms不一样,为什么
解决方案
解决方案二:
这里指的是毫秒1000毫秒=1秒
解决方案三:
楼主你有没想过如果你中间不加Thread.Sleep,你认为所有时间都会相同吗
解决方案四:
本身sleep并不精确sleep(0),sleep(1),sleep(10),实际测试效果没什么不同.到100的级别才有明显区别.而且DateTime.Now取值也并不是连续的.你可以试试不加sleep,循环10W次输出DateTime.Now
解决方案五:
DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss.fff")这样写起来要简化多了
解决方案六:
其实时间格式化字符串可以精确到小数点后6位不过DateTime.Now本身并没有那么精确.显示6位也并不是从最低位开始改变的.一变就变好几位.
解决方案七:
额,这个问题涉及到windows线程的知识,thread.sleep(-1)会告诉系统永远不调度这个线程,thread.sleep(0)会告诉系统当前线程放弃了他当前的时间片的剩余部分,强迫系统调度另一个线程,thread.sleep(1)总是强迫cpu执行一次上下文切换,实际上线程睡眠的时间会大于1毫秒,thread.sleep方法,会导致线程挂起自身大约多长时间,而这个时间不是一个固定值,比如说你传入的是100可能线程实际的睡眠时间会超过100毫秒或者小于100ms这只是一个大概的值。比如说如果你这个线程的优先级比较低,你让它睡眠1秒,可能在1秒后系统有优先级比它高的线程,系统并不会在1秒后调度你的线程,它会先调度优先级高的线程。说了那么多就是想告诉你,sleep-1,0,1的效果是不一样的,sleep方法的目的是为了让你的线程延迟调用,而你传入的时间对于系统来说也只是一个大概的值。
解决方案八:
刚才实测了一下,循环100次sleep(0)用时0sleep(1)用时1.5625ssleep(2)用时1.5625ssleep(10)用时1.5625ssleep(15)用时1.5625s在sleep(16)开始有变化,时间延长了一倍,3.125一直到sleep(31)都是3.125
解决方案九:
跟cup线程调度时间片的长短有关系
解决方案十:
引用7楼Z65443344的回复:
刚才实测了一下,循环100次sleep(0)用时0sleep(1)用时1.5625ssleep(2)用时1.5625ssleep(10)用时1.5625ssleep(15)用时1.5625s在sleep(16)开始有变化,时间延长了一倍,3.125一直到sleep(31)都是3.125
额新技能
解决方案十一:
这个问题之前有讨论过。首先,你的Windows中的Thread.sleep()是有误差的,并不是绝对精确的。原因是因为windows操作系统是一个分时操作系统而不是一个实时操作系统,线程调度,切换也是要花费时间的。一些比较特殊的场景才用实时操作系统,比如军工的一些域。
解决方案十二:
引用10楼MicrosoftCenterOfHN的回复:
这个问题之前有讨论过。首先,你的Windows中的Thread.sleep()是有误差的,并不是绝对精确的。原因是因为windows操作系统是一个分时操作系统而不是一个实时操作系统,线程调度,切换也是要花费时间的。一些比较特殊的场景才用实时操作系统,比如军工的一些域。
做控制的话还是要用PLC吧?台式机最大的作用是人机交互,要将数据显示给用户看,要能响应用户的操作.都是在跟人打交道.而对于人来说,1毫秒跟200毫秒有什么差别么?人只对500毫秒以上的时间能够分辨.
解决方案十三:
因为每次sleep后,都重新按优先级排队。sleep结束,排队正赶上它优先级最高就先处理它,否则就先处理其他线程。嘻嘻,刚刚学到的~~~~~
解决方案十四:
引用12楼nan2008zzu的回复:
因为每次sleep后,都重新按优先级排队。sleep结束,排队正赶上它优先级最高就先处理它,否则就先处理其他线程。嘻嘻,刚刚学到的~~~~~
跟谁学,被谁坑?
解决方案十五:
引用13楼sp1234的回复:
Quote: 引用12楼nan2008zzu的回复:
因为每次sleep后,都重新按优先级排队。sleep结束,排队正赶上它优先级最高就先处理它,否则就先处理其他线程。嘻嘻,刚刚学到的~~~~~跟谁学,被谁坑?
哈哈。自学
解决方案:
以前的电脑只有一个cpu然后我电脑上开了画图板和记事本两个程序所以说为了让用户觉得两个程序都在运行所以让画图板执行一段时间然后又马上切换到记事本去这样用极快的速度在这两个程序中切换执行用户就感觉到这两个程序是在正常的运行多线程差不多就是这个效果和原理而windows的时间片是10毫秒也就是说假设你现在电脑上只有两个线程TA和TB那么windows会在TA上执行10毫秒然后立马去执行TB然后又去执行TA但是如果这个时候在TA中出现sleep(20)那么系统认为TA要放弃这10毫秒的执行权利然后又跑去TB上执行10毫秒回来再去TA发现还没有到20毫秒于是继续切换到TB上去知道切回到TA的时候过了20毫秒TA才会有继续执行的权利所以说你的每一个Sleep效果都是大于等于你要sleep的时间的如果现在出现了很糟糕的情况系统中所有运行的程序的所有线程假设一共有100个线程而这100个线程里面全部都是死循环cpu处于满载状态那么每个线程都会把10毫秒占用完也就是在切换一圈回来时候即使你写的是sleep(1)回来的时候也是过了100*10毫秒了。。。
解决方案:
时间精度问题,sleep精度不确定,我只记得msdn上看到过timer精度是30毫秒