1 System.Timers.Timer = 1个帖子?

时间:2011-12-05 11:36:39

标签: c# multithreading timer

如果每个计时器有1个线程?

例如:

class MyObj
{
    private Timer _timer;

    public MyObj()
    {
        Initialize();
    }

    private void Initialize()
    {
        _timer = new Timer(2000);
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
        _timer.Start();
    }

    void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("MyObj !");
    }


}
class Program
{
    private static Timer _timer;

    private static void Main(string[] args)
    {
        _timer = new Timer(500);
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
        _timer.Start();
        MyObj mo = new MyObj();
        Console.Read();
    }

    static void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Program !");
    }
}

有两个帖子吗?

2 个答案:

答案 0 :(得分:4)

计时器使用ThreadPool,因此最多使用2个线程。但是,由于ThreadPool中的线程被回收,它可能最终使用相同的线程两次,或者两个线程但不同时使用。

计时器本身不会导致创建线程。

此外,如果您的计时器永远不会打勾 - 它不会向ThreadPool发布任何工作,所以本质上不会“花费”任何线程。

请注意,虽然tick线程是不确定的...你创建定时器的线程是线程将发生勾号。你的tick中的任何逻辑都需要知道它可以与类中的其他东西并行运行。

答案 1 :(得分:3)

每个计时器没有保留的线程。事件在线程池线程上进行调度,并且在事件处理程序未运行时,计时器不会阻塞线程。由于存在多个线程池线程,因此事件处理程序仍然需要是线程安全的。

文档说明:

  

如果SynchronizingObject属性为Nothing,则会在ThreadPool线程上引发Elapsed事件。如果Elapsed事件的处理持续时间超过Interval,则可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。