净超时:WaitForSingleObject的VS定时器(.Net Timeouts: WaitF

2019-07-21 08:51发布

我执行的异步操作(一系列网络IO的)超时,我不知道这是“好”(从分配/性能)的角度:创建的EventWaitHandle使用RegisterWaitForSingleObject,或者只是创建一个定时器并使用其蜱。

在我的特定情况下的EventWaitHandle是懒惰创建的,但显然它不得不被实例化使用WaitForSingleObject的。 因此,其实这是一个关于的WaitHandle + WaitForSingleObject的的VS定时器资源成本的问题。 这两种方法都一样容易实现。

我在不同时期实施的两个,让我明白了地形,我只是不知道哪种方法是“好”。

Answer 1:

微软的摩根斯金纳似乎更喜欢RegisterWaitForSingleObject 。

至于分配而言,反射显示, RegisterWaitForSingleObject创建的实例RegisteredWaitHandle ,而计时器创建一个内部TimerBase ,以及一个名为类_TimerCallback 。 人们可以去和比较这些类等等的大小,但他们似乎有更多的依赖性,尤其是那些非托管(包括使用底层Win32函数) - 所以我真的不能给出一个明确的答案。

关于传递给等待句柄RegisterWaitForSingleObject但是,请记住,你可以分配一个Maunal /的AutoResetEvent,并传递给所有呼叫(因为你上的超时计数,所以你永远不会无论如何信号的话)。

至于性能也越高,我也不清楚。 线程池将使用一种特殊的等待线程通过注册的每个63个行动RegisterWaitForSingleObject 。 相反,定时器将使用基础Win32定时器。 双方将最终使用线程池的工作线程的实际执行。 这是在该场景中更好? 我就不清楚了..所以我会用斯金纳走在这一个:)

另请参阅:

  • 多线程:等待注册
  • 多线程:编码寄存器等待模式


Answer 2:

都不是更好的。 使用定时器周期性“捅”你的线程做一些事情。 WaitForSingleObject的等待在拉手。 超时是有那么你可以用它来决定不再等待,而不是被陷在僵局。 用一个定时器打破WaitForSingleObject的了锁的,如果你使用的超时不是必需的。

资源成本可以忽略不计两个。 我不能说哪一种方法,你应该,因为它高度依赖于你的代码的情况下使用。



文章来源: .Net Timeouts: WaitForSingleObject vs Timer