.Net超时:WaitForSingleObject vs Timer

我在一个异步操作(一系列网络IO)上实现了一个超时,并且我不确定哪一个更好(从分配/性能角度):创建一个EventWaitHandle并使用RegisterWaitForSingleObject,或者只是创建一个Timer并使用它的Tick。

在我的具体情况下,EventWaitHandle是惰性创建的,但显然它必须被实例化以使用WaitForSingleObject。 所以真的这是一个关于WaitHandle + WaitForSingleObject vs Timer的资源成本的问题。 两种方法都很容易实现。

我已经在不同的时间实施了两次,所以我了解地形,我只是不确定哪种方法更好。


微软的Morgan Skinner似乎更喜欢RegisterWaitForSingleObject。

至于分配而言,反射显示, RegisterWaitForSingleObject创建的实例RegisteredWaitHandle ,而计时器创建一个内部TimerBase ,以及一个名为类_TimerCallback 。 可以继续比较这些类的大小等等,但它们似乎有更多的依赖关系,特别是非托管的(都使用底层的win32函数) - 所以我实在无法给出直接的答案。

关于传递给RegisterWaitForSingleObject的等待句柄,请记住,你可以分配一个Maunal / AutoResetEvent并将其传递给所有的调用(因为你指望超时,所以你永远不会发出信号)。

就表现而言,我也不确定。 ThreadPool将为每个通过RegisterWaitForSingleObject 63个动作使用一个特殊的等待线程。 相反,计时器将使用底层的win32定时器。 两者最终都会使用ThreadPool工作线程来进行实际执行。 哪种情况下哪个更好? 打我..所以我会和这个人一起去Skinner :)

另请参阅:

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

  • 没有更好的了。 定时器用于定期“戳”你的线程做些事情。 WaitForSingleObject等待句柄。 超时在那里,所以你可以用它来决定停止等待,而不是陷入僵局。 如果使用超时,则不需要使用计时器将waitforsingleobject从锁中解锁。

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

    链接地址: http://www.djcxy.com/p/43503.html

    上一篇: .Net Timeouts: WaitForSingleObject vs Timer

    下一篇: Success stories for JavaFX