c# - System.Timers.Timer 是否在独立线程中运行?

标签 c# .net timer

我试图了解 System.Timers.Timer 引发 elapsed 事件的时间,它是在独立线程中引发的吗?

我下面的例子似乎表明三个计时器在它们自己的线程中独立运行:

class Program
{
    static System.Timers.Timer timer = new System.Timers.Timer();
    static System.Timers.Timer timer2 = new System.Timers.Timer();
    static System.Timers.Timer timer3 = new System.Timers.Timer();

    static void Main(string[] args)
    {
        timer.Elapsed += new System.Timers.ElapsedEventHandler(
            timer_Elapsed);
        timer2.Elapsed += new System.Timers.ElapsedEventHandler(
            timer2_Elapsed);
        timer3.Elapsed += new System.Timers.ElapsedEventHandler(
            timer3_Elapsed);

        timer.Interval = 1000;
        timer2.Interval = 1000;
        timer3.Interval = 1000;

        timer.Start();
        timer2.Start();
        timer3.Start();

        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }

    static void timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timer3.Stop();
        Console.WriteLine("Timer 3 Hit...");            
        timer3.Start();
    }

    static void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timer2.Stop();
        Console.WriteLine("Timer 2 Hit...");
        Thread.Sleep(2000);
        timer2.Start();
    }

    static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timer.Stop();
        Console.WriteLine("Timer 1 Hit...");
        Thread.Sleep(10000);
        timer.Start();
    }
}

enter image description here

最佳答案

根据 MSDN,在 System.Timers.Timer 上,当 Elapsed 事件触发时,它会在系统线程池中的线程上调用:

If the SynchronizingObject property is Nothing, the Elapsed event is raised on a ThreadPool thread. If processing of the Elapsed event lasts longer than Interval, the event might be raised again on another ThreadPool thread. In this situation, the event handler should be reentrant.

由于 SynchronizingObject 的默认值是 null,因此所有经过的事件都将在线程池中处理。所以,这取决于线程池有多满,如果有空闲线程,那么每个经过的事件很可能在单独的线程上并发运行。但是,如果由于某种原因,系统线程池已完全使用,则经过的事件可能会按计划进行序列化。

要点是:“视情况而定”。也就是说,只要池中有空闲线程,它们就可以并行运行。

引用:MSDN on System.Timers.Timer

关于c# - System.Timers.Timer 是否在独立线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7893773/

相关文章:

c# - 在 C# 中同步闪烁标签

c++ - 访问 QTimer 的经过秒数?

c - 是否可以将参数传递给 c 计时器的处理程序?

c# - 具有常量的 Fluent NHibernate 引用

c# - Xamarin.Forms 选项卡式页面和注销

.net - 无法访问已处置的对象 - 如何修复?

c# - 在 C# 中合并两个 XML 文件,其中一个不一致

从 SQLite 数据库生成 C# POCO

c# - 没有使用 Parse Push 和 Xamarin IOS 注册的设备

.net - SubscribeOn 和 ObserveOn 有什么区别