【问题标题】:.Net Timeouts: WaitForSingleObject vs Timer.Net 超时:WaitForSingleObject 与计时器
【发布时间】:2010-12-04 20:24:04
【问题描述】:

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

在我的具体情况下,EventWaitHandle 是惰性创建的,但显然它必须实例化才能使用 WaitForSingleObject。所以实际上这是一个关于 WaitHandle + WaitForSingleObject 与 Timer 的资源成本的问题。这两种方法都非常容易实施。

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

【问题讨论】:

    标签: .net timeout multithreading


    【解决方案1】:

    微软的 Morgan Skinner seems to prefer RegisterWaitForSingleObject.

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

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

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

    另见:

    【讨论】:

    • 他的博客文章很好地比较了用法,但并不是非常强烈地推荐其中一种与另一种。而且我想得越多,我就越看不出内核转换等方面的任何差异。我仍然想知道底层 Win32 API 是否有任何成本差异,但 .net 实现的“重量”似乎也是我找到的最佳答案。
    【解决方案2】:

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

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

    【讨论】:

    • 我不同意。这是一个简单的问题:分配计时器的成本与分配等待句柄和 WaitForSingleObject 的成本。它们都是操作系统资源。无论我的情况如何,一个必须比另一个花费更多。虽然在这种情况下我说的是“一次性”计时器,但 both 可用于定期“戳”您的代码 - 您可以在 RegisterWaitForSingleObject 上使用“executeOnlyOnce”标志...跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多