private System.Timers.Timer timerCount;timerCount= new System.Timers.Timer(1000);
timerCount.Elapsed += new ElapsedEventHandler(timerCount_Elapsed);
timerCount.Enabled = true;
void timerCount_Elapsed(object sender, ElapsedEventArgs e)
{
      // do something.
}我想问问,是不是每隔1秒,timerCount_Elapsed 都是在一个新开的线程当中运行吗 ?

解决方案 »

  1.   

    应该不是,System.Timers.Timer本身开一个线程循环以及触发Elapsed事件。
    另外,System.Windows.Forms.Timer则是在主线程下的。
      

  2.   

    System.Timers.Timer应该是被线程池管理的
    而线程池里面挂起的线程据说超过40秒不使用的话也会被销毁
      

  3.   


    public partial class Form1 : Form
        {
            System.Timers.Timer timer = new System.Timers.Timer(5000);
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
                
            }        private void Form1_Load(object sender, EventArgs e)
            {
                timer.Enabled = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            }        void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                string k = DateTime.Now.ToString();
                while (true)
                {
                    Thread.Sleep(1000);
                    listBox1.Items.Add(k);
                }
            }
        }
    我自己写了一段代码,来测试,现在几乎可以得到结果 , 肯定会定时开启新的线程 。
      

  4.   

    System.Windows.Forms.Timer是通过Windows消息机制实现的
    System.Timers.Timer和System.Threading.Timer非常类似,通过.NET  Thread  Pool实现的
    被线程池管理
      

  5.   


    每一次触发 Elapsed ,都是开启的新线程对吧?
      

  6.   

    Timer的创建线程是UI线程,而执行线程是TheardPool中的线程 Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。http://blog.csdn.net/cc_net/archive/2008/12/06/3461549.aspx
      

  7.   


    没看出你这代码说明什么问题,开线程是肯定的,但不会每次执行都开一个新线程。    public partial class Form1 : Form
        {
            System.Timers.Timer timer = new System.Timers.Timer(1000);
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }        private void Form1_Load(object sender, EventArgs e)
            {
                timer.Enabled = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                this.Text = Thread.CurrentThread.GetHashCode().ToString(); //主线程hash
            }        void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                listBox1.Items.Add(Thread.CurrentThread.GetHashCode());//每次执行elapsed的时候的线程hash
            }    }
      

  8.   

    定时器线程是从线程池里调出来的,准确的说不算新开的线程,因为没有创建线程。
    系统决定在线程池的哪一个线程上触发事件,不应该假设每次都在同一个线程上触发事件。但是,为减少开销,系统会尽量将其安排在同一个线程。在8楼所说的情况下,即Elapsed事件处理时间超过Interval,就会在另一个线程上触发事件。using System;
    using System.Timers;namespace timer
    {
        class Program
        {       
            public static void Main(string[] args)
            {
                Timer timer=new Timer(1000);
                timer.Elapsed+= new ElapsedEventHandler(timer_Elapsed);            
                timer.Start();
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey(true);
            }        static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {            
                Console.WriteLine(System.Threading.Thread.CurrentThread.GetHashCode());
                System.Threading.Thread.Sleep(1500);
            }
        }
    }