代码之家  ›  专栏  ›  技术社区  ›  Allen Rice 0x6A75616E

对于windows服务,哪一个更好,是等待旋转还是计时器?

  •  4
  • Allen Rice 0x6A75616E  · 技术社区  · 15 年前

    This question about Timers for windows services

    假设我有一个windows服务正在等待 WaitHandle 当它醒来时,它会像我在下面的流程图中所示那样陷入等待状态

    wait spin diagram http://www.86th.org/waitspin.jpg

    我很好奇,使用计时器是否比使用计时器更好 wait-spin loop

    让我知道这是否应该是一个维基

    6 回复  |  直到 8 年前
        1
  •  5
  •   Christopher    15 年前

    我不会真的说你在做旋转等待,因为我通常认为旋转等待是不睡觉的东西。它只是在等待go信号时消耗处理器的所有时间。

        2
  •  2
  •   James Hugard    15 年前

    休眠线程和等待句柄超时基本上是同一回事。我猜定时器基本上是使用睡眠实现的,所以也没有太大区别。换句话说,您可以通过在单个循环中等待句柄并超时来简化代码,并检查释放等待的原因(数据可用或超时),而不是实现单独的等待和睡眠循环。比独立循环的效率略高。

    理想情况下,您根本不会使用sleep,只需依赖数据生成代码来正确引发您的消费代码正在等待的事件,并在事件源消失时处理较长的超时。

    如果数据是外部的,例如在套接字或其他输入设备上,则通常可以将句柄设置为允许等待数据变为可用-在这种情况下无需轮询,因为当数据准备好使用时,事件将始终发出信号。

        3
  •  1
  •   Jim Evans    15 年前

    我们使用线程。它们的性能不仅像计时器一样,还为我们提供了一个在线程睡眠时执行其他操作的句柄。

        4
  •  1
  •   Community CDub    8 年前

    我认为这取决于你的要求:

    1. 运行任务 每一个
    2. 完成当前任务后,运行下一个任务 5分钟。

    事实上,我对一个类似的问题提出了更长的评论(包括对案例1的一些考虑)( Windows service scheduled execution

        5
  •  1
  •   Marsh Ray    15 年前

    投票是不好的,而且几乎总是可以避免的。偶尔,对于一些琐碎的事情,它比避免它所需要的复杂性要糟糕得多。

    还有,不要 Sleep() 在严重的代码(如服务)中使用任何长时间。你唯一能做的就是阻止 WaitFor[Single|Multiple]Objects(...) Sleep(millisec) 并将其替换为 WaitForSingleObjects(g_shutdownEvent, millisec) .

        6
  •  0
  •   Mark Brackett    15 年前

    正如陈雷蒙解释的那样, "Yeah, whatever." 通知 当您的数据准备就绪时,您的SOL。