【发布时间】:2011-03-08 19:59:32
【问题描述】:
我在 Windows 服务中使用 Systems.Timers.Timer 实例。我的问题是,无论 Timer_Elapsed 方法中的内容是什么,该代码是在运行 Windows 服务的同一线程中执行,还是 Timer 在单独的线程上内部执行 elapsed 方法?
【问题讨论】:
我在 Windows 服务中使用 Systems.Timers.Timer 实例。我的问题是,无论 Timer_Elapsed 方法中的内容是什么,该代码是在运行 Windows 服务的同一线程中执行,还是 Timer 在单独的线程上内部执行 elapsed 方法?
【问题讨论】:
Abhishek Sur 最近的blog post 可以回答您的问题。
总之,System.Timers.Timer:
【讨论】:
是的 - 但是完全正确这有点复杂(see MSDN):
如果 SynchronizingObject 属性为 null,则在 ThreadPool 线程上引发 Elapsed 事件。如果 Elapsed 事件的处理持续时间超过 Interval,则该事件可能会在另一个 ThreadPool 线程上再次引发。在这种情况下,事件处理程序应该是可重入的。
但不管怎样;这不是你的线程 - 适当的代码,同步。
【讨论】:
Elapsed 事件处理程序将在另一个线程上执行,而不是在启动服务的线程上执行,除非您手动指定同步对象以提供同步上下文。
这主要针对 Windows 窗体应用程序,其中System.Windows.Forms.Control(以及所有派生类型,例如Form)实现ISynchronizeInvoke 接口,并且可以轻松附加到计时器以同步执行。在 Windows 服务环境中,您必须编写该接口的存根实现来进行必要的线程同步,因为服务本身不提供此类实现。
【讨论】: