gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:02:16 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com