当我创建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 + "]");
}
/*
[threadid:10] Main Thread
[threadid:7]
[threadid:7]
[threadid:7]
[threadid:12]
[threadid:7]
[threadid:12]
etc...
*/
/*
[threadid:10] Main Thread
[threadid:7]
[threadid:7]
[threadid:7]
[threadid:7]
etc...
*/
我看到Elapsed
事件在触发时显示不同的线程。虽然当我将Interval
值更改为更高的值(如2000(而不是1000))时,它似乎仍保留在同一个线程中。
为什么?
我想要一个计时器来触发它自己的线程,但只是在一个线程而不是多个线程上触发。
答案 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类。