如果我有两个系统计时器分别在 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
最佳答案
CLR 使用专用线程来跟踪事件的 System.Timers.Timer 和 System.Threading.Timer 计时器。 Elapsed 事件在从线程池中拉出的另一个线程上引发。
所以,是的,它们在不影响彼此的情况下保持滴答作响。你必须非常小心,你的 Elapsed 事件处理程序很可能在它仍在执行时再次被调用。当它花费的时间超过间隔时会发生这种情况。或者更糟的是,当机器负载很重或者您有很多事件的线程池线程时。如果您的事件处理程序不是线程安全的,这可能会导致很难诊断故障。几乎从来没有。将计时器的 AutoReset 属性设置为 false 是避免此问题的简单方法。
关于c# - c# 定时器自然是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339553/