有点儿。首先,查看 MSDN 页面:http System.Timers.Timer
: //msdn.microsoft.com/en-us/library/system.timers.timer.aspx
您需要关注的部分引用如下:
如果 SynchronizingObject 属性为 null,则在 ThreadPool 线程上引发 Elapsed 事件。如果 Elapsed 事件的处理持续时间超过 Interval,则该事件可能会在另一个 ThreadPool 线程上再次引发。在这种情况下,事件处理程序应该是可重入的。
基本上,这意味着Timer
' 的动作在哪里运行并不是每个Timer
都有自己的线程,而是默认情况下,它使用系统ThreadPool
来运行动作。
如果您希望事情同时运行(同时开始)但同时运行,您不能只将多个事件放在经过的事件上。例如,我在 VS2012 中尝试过这个:
static void testMethod(string[] args)
{
System.Timers.Timer mytimer = new System.Timers.Timer();
mytimer.AutoReset = false;
mytimer.Interval = 3000;
mytimer.Elapsed += (x, y) => {
Console.WriteLine("First lambda. Sleeping 3 seconds");
System.Threading.Thread.Sleep(3000);
Console.WriteLine("After sleep");
};
mytimer.Elapsed += (x, y) => { Console.WriteLine("second lambda"); };
mytimer.Start();
Console.WriteLine("Press any key to go to end of method");
Console.ReadKey();
}
输出是这样的:
按任意键转到方法的结尾
第一个拉姆达。
睡 3 秒
睡觉后
第二个拉姆达
所以它连续执行它们而不是同时执行。因此,如果您希望在每次计时器执行时发生“一堆事情”,则必须在处理程序中启动一堆任务(或将 ThreadPool 与操作排队)Elapsed
。它可能会多线程,也可能不会,但在我的简单示例中,它没有。
自己试试我的代码,很容易说明发生了什么。