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