System.Timers.Timer是否使用单独的线程来执行timer elapsed方法

时间:2011-03-08 19:59:33

标签: c# timer

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

3 个答案:

答案 0 :(得分:4)

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

总之,System.Timers.Timer

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

答案 1 :(得分:1)

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

  

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

但无论如何;它不是你的线程 - 代码是适当的,同步。

答案 2 :(得分:0)

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

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