.Net超时:WaitForSingleObject与Timer

pie*_*rs7 9 .net multithreading timeout

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

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

我已经在不同的时间实现了这两个,所以我了解地形,我只是不确定哪种方法"更好".

Oha*_*der 4

微软的 Morgan Skinner似乎更喜欢 RegisterWaitForSingleObject

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

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

就性能而言,我也不确定。ThreadPool 将为通过 注册的每 63 个操作使用一个特殊的等待线程RegisterWaitForSingleObject。相反,计时器将使用底层 win32 计时器。两者最终都会使用 ThreadPool 工作线程来进行实际执行。哪些场景下哪个更好?打败了我..所以我会选择斯金纳来做这件事:)

另请参阅: