c# - c# 定时器自然是多线程的吗?

标签 c# multithreading timer

如果我有两个系统计时器分别在 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/

相关文章:

c# - 使 WPF 应用程序全屏(覆盖开始菜单)

c# - 如何找出导致 NullReferenceException 的原因

c# - 在运行时设置通用类型

c# - 有没有办法暂停所有 Threading.Timer 计时器?

javafx场景中的javafx线程异常

c# - 网页 - 3d 地震可视化 - Silverlight?

python - SQL 数据库中查询的多线程

c - 为什么在调用计时器的函数中参数具有其他值?

android - 如何在 CountDownTimer 上添加和删除时间?

c# - 有没有更好的方法来等待排队的线程?