Thread.Sleep(timeout)和ManualResetEvent.Wait(timeout)有什么区别?Thread.Sleep(timeout)和resetEvent.Wait(timeout)都会导致执行暂停至少timeout毫秒,那么它们之间有区别吗?我知道Thread.Sleep导致线程放弃其时间片的剩余部分,因此可能导致睡眠持续时间比请求的时间长得多。ManualResetEvent对象的Wait(timeout)方法是否有同样的问题?编辑:我知道ManualResetEvent的要点是从另一个线程发出信号-现在我只关心事件的Wait方法的情况,指定了超时,并且没有其他调用者设置事件。我想知道按时唤醒是否比Thread.Sleep更准确Thread.Sleep(timeout)在恢复执行之前导致无条件等待。resetEvent.WaitOne(timeout)导致线程等待,直到(1)事件触发,或(2)达到超时。使用事件的关键是从另一个线程触发它们,所以你可以直接控制线程何时被唤醒。如果没有必要,您不应该使用事件对象。编辑:时间明智,它们都同样可靠。然而,你关于“准时起床”的评论让我担心。为什么需要按时唤醒代码?Sleep和WaitOne并不是设计出来的。仅当超时低于50毫秒左右并且您需要可靠性时,才应研究其他计时方法。这篇文章看起来很棒。Thread.Sleep和ManualResetEvent.WaitOne之间的主要区别在于,您可以使用Set方法向正在等待SetResetEvent的线程发出信号,从而导致线程在超时之前唤醒。如果您不发出信号,那么我希望它们的行为非常相似。从.NETReflector中,我可以看到方法ManualResetEvent.WaitOne最终调用具有以下签名的外部方法:intWaitOneNative(SafeWaitHandlewaitHandle,uintmillisecondsTimeout,boolhasThreadAffinity,boolexitContext);Thread.Sleep调用这个外部方法:voidSleepInternal(intmillisecondsTimeout);不幸的是我没有这些方法的源代码,所以我只能猜测。我想在这两个调用中都会导致线程在等待超时期限之前被分派,不比另一个调用更准确。对于延迟和周期,我发现Monitor.Wait是一个不错的选择..objecttimelock=newobject();锁(时间锁){Monitor.Wait(时间锁,TimeSpan.FromMilliseconds(X.XX));结果是...~1ms抖动或更好,具体取决于应用。您可能已经知道Thread.Sleep(X)是不可靠的并且无法取消....我像躲避瘟疫一样避开它。Sleep()函数已经很久没有这样了。它的准确性由多媒体定时器周期决定,你可以通过P/InvokingtimeBeginPeriod()来改变它。不幸的是,在我的机器上,我有程序将这个时间设置为1毫秒,从而使睡眠精确到毫秒。这是一些自己尝试的代码:usingSystem;使用系统诊断;使用系统线程;使用System.Runtime.InteropServices;类程序{staticvoidMain(string[]args){//timeBeginPeriod(1);varsw1=秒表.StartNew();for(intix=0;ix我机器上的输出:Sleep:999,Wait:1003Variabilityisabout5ms.Thedifference,asothershavementioned,isthatifyouissueSignal,WaitOnemayreturnbeforesleeptime.sleepisguaranteed等待睡眠时间。反射器调用中的Thread.Sleep:[MethodImpl(MethodImplOptions.InternalCall)]boolhasThreadAffinity,boolexitContext);不确定是否有区别,但我会看看我是否可以找到一些东西。睡眠指定时间。如果发出事件信号,事件等待可以更快结束。这就是事件的目的:允许一个线程告诉另一个线程唤醒。在一篇文章中你会说:mre.WaitOne(10000);//十秒Console.WriteLine("Wokeup!");在另一篇文章中你会说:mre.Set();//这会导致`WaitOne`在第一个线程中返回如果没有在另一个线程中调用Set,第一个线程将有效休眠10秒。以上就是C#学习教程:Thread.Sleep(超时)和ManualResetEvent.Wait(超时)有什么区别?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
