为什么System.Timers.Timer在触发Elapsed事件时会创建多个线程?

时间:2016-07-13 19:03:31

标签: c# multithreading timer system.timers.timer

当我创建System.Timers.Timer例如...

private System.Timers.Timer m_checker = new System.Timers.Timer();
public MyClass()
{
    Debug.WriteLine("[threadid:" + Thread.CurrentThread.ManagedThreadId + "] Main Thread");
    m_checker.Elapsed += m_checker_Elapsed;
    m_checker.Interval = 1000;
    m_checker.Start();
}

private void m_checker_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Debug.WriteLine("[threadid:" + Thread.CurrentThread.ManagedThreadId + "]");
}

间隔设置为1000的结果:

/*
[threadid:10] Main Thread
[threadid:7]
[threadid:7]
[threadid:7]
[threadid:12]
[threadid:7]
[threadid:12]
etc...
*/

间隔设置为2000的结果:

/*
[threadid:10] Main Thread
[threadid:7]
[threadid:7]
[threadid:7]
[threadid:7]
etc...
*/

我看到Elapsed事件在触发时显示不同的线程。虽然当我将Interval值更改为更高的值(如2000(而不是1000))时,它似乎仍保留在同一个线程中。

为什么?

我想要一个计时器来触发它自己的线程,但只是在一个线程而不是多个线程上触发。

2 个答案:

答案 0 :(得分:2)

它使用线程池来执行处理程序。根据您的程序正在执行的操作,您的线程池可能包含一个或多个线程,并且您可能有或可能没有处理任何给定请求的不同线程。

答案 1 :(得分:1)

这样做是因为这就是它的写作方式。

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

  

基于服务器的System.Timers.Timer类设计用于多线程环境中的工作线程。服务器计时器可以在线程之间移动以处理引发的Elapsed事件。 。 。

FWIW,Microsoft建议您不要使用它:

  

Timer类仅在.NET Framework中可用。它不包含在.NET标准库中,并且在其他平台上不可用,例如.NET Core或Universal Windows Platform。在这些平台上,以及跨所有.NET平台的可移植性,您应该使用System.Threading.Timer类。