如果我有两个系统计时器分别在 10 秒和 20 秒触发事件,对事件函数的调用是否是多线程的?在下面的场景中,我的计时器分别以 10 秒和 12 秒的间隔触发事件。函数 'My10sEvent' 应该首先被调用。如果它是一个需要 8 秒运行的慢函数,它会阻止另一个事件(tmr12s),还是第二个事件会在 12s 时准时触发?
System.Timers.Timer tmr10s = new System.Timers.Timer(10000.0);
tmr10s.Enabled = true;
tmr10s.Elapsed += new ElapsedEventHandler(My10sEvent);
System.Timers.Timer tmr12s = new System.Timers.Timer(12000.0);
tmr12s.Enabled = true;
tmr12s.Elapsed += new ElapsedEventHandler(My12sEvent);
Thread.Sleep(System.Threading.Timeout.Infinite); //sleep indefinitely to let the above events fire
Run Code Online (Sandbox Code Playgroud)
CLR 使用专用线程来跟踪活动的 System.Timers.Timer 和 System.Threading.Timer 计时器。Elapsed 事件在从线程池中拉出的另一个线程上引发。
所以是的,它们会一直滴答作响而不会相互影响。您必须非常小心,您的 Elapsed 事件处理程序很有可能在它仍在执行时再次被调用。当它花费的时间超过间隔时会发生这种情况。或者更糟的是,当机器负载很重或者您有很多活动线程池线程时。如果您的事件处理程序不是线程安全的,这可能会导致很难诊断故障。几乎从来没有。将计时器的 AutoReset 属性设置为 false 是避免此问题的简单方法。