2014-01-22 52 views
8

我需要一个解决方案来执行任意暂停。延迟精度无关紧要。 WaitHandle.WaitOne Method (TimeSpan)Thread.Sleep Method之间在这种情况下的实际区别是什么。有没有更好的解决方案?AutoResetEvent.WaitOne与超时与Thread.Sleep

+0

'更好'取决于具体情况。等待基本上是错误的,所以在这里没有“最佳做法”。 –

+1

当我只需要等待时,有什么不好呢?我只是想知道从性能角度来看哪种方法更好,或者如果他们在相同的方式下行事,那么我会根据其他因素(如可读性)来做出我的决定。 –

+0

为什么要创建一个'AutoResetEvent',调用'WaitOne',处理事件,什么时候可以简单地执行'Thread.Sleep'? – Henrik

回答

6

  • 超时如果你的规范说像“永远等待至少两秒钟后再继续',使用Sleep()。

    如果你的规范说'等待来自另一个线程的信号最多两秒钟,如果超时返回错误'使用事件对象。

    基本上就是这么简单。

    基本上没有“性能差异”。由于两个调用都使用相同的超时机制,因此时序精确。

    '更好'的解决方案 - 什么是'更好'?在哪方面更好?

  • +0

    更好的表现或更优雅。 –

    5

    1.Thread.Sleep(超时)在执行恢复前导致无条件等待。

    2.WaitOne(超时)会导致线程等待,直到

    • 该事件被触发,达到
    +0

    那么你的主张是什么?我应该使用1st还是2nd? –

    +0

    这取决于您的要求。我总是更喜欢基于信号的同步eg.WaitOne –

    +0

    第一或第二种方式等待性能差异的部分在哪里? –

    1

    我会反对使用Thread.Sleep(...) ......因为我不喜欢阻塞一个不必要的线程......所以使用WaitHandle我认为是最好的选择。

    替代

    如果你的代码的优雅会使用WaitHandle受苦,那么你有没有考虑await Task.Delay(...)?这将使功能与Thread.Sleep(...)相似,而不会阻塞线程。

    +0

    ??等待事件句柄阻塞线程,就像sleep()调用一样。 –

    +0

    @MartinJames但是没有阻塞线程......'Task.Delay()'实际上使用了一个定时器。 – Andrew

    +0

    在另一个线程上异步执行,例如。按任务。Delay()肯定是可能的,但OP会询问调用线程中的同步延迟。 –