【问题标题】:Does System.Timers.Timer uses a seprate thread to execute timer_elapsed methodSystem.Timers.Timer 是否使用单独的线程来执行计时器经过的方法
【发布时间】:2011-03-08 19:59:32
【问题描述】:

我在 Windows 服务中使用 Systems.Timers.Timer 实例。我的问题是,无论 Timer_Elapsed 方法中的内容是什么,该代码是在运行 Windows 服务的同一线程中执行,还是 Timer 在单独的线程上内部执行 elapsed 方法?

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    Abhishek Sur 最近的blog post 可以回答您的问题。

    总之,System.Timers.Timer

    1. 它调用 ThreadPool 中的可用线程来运行接口。
    2. ThreadSafe,每个事件处理程序都有明确的锁。
    3. 可以在任何使用 ISynchronizeObject 的线程中运行。

    【讨论】:

      【解决方案2】:

      是的 - 但是完全正确这有点复杂(see MSDN):

      如果 SynchronizingObject 属性为 null,则在 ThreadPool 线程上引发 Elapsed 事件。如果 Elapsed 事件的处理持续时间超过 Interval,则该事件可能会在另一个 ThreadPool 线程上再次引发。在这种情况下,事件处理程序应该是可重入的。

      但不管怎样;这不是你的线程 - 适当的代码,同步。

      【讨论】:

        【解决方案3】:

        Elapsed 事件处理程序将在另一个线程上执行,而不是在启动服务的线程上执行,除非您手动指定同步对象以提供同步上下文。

        这主要针对 Windows 窗体应用程序,其中System.Windows.Forms.Control(以及所有派生类型,例如Form)实现ISynchronizeInvoke 接口,并且可以轻松附加到计时器以同步执行。在 Windows 服务环境中,您必须编写该接口的存根实现来进行必要的线程同步,因为服务本身不提供此类实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          • 2011-03-24
          • 1970-01-01
          相关资源
          最近更新 更多