在程序中用了多个timer控件,有可能在执行timer1_Tick中程序时,timer2_Tick被触发,程序会怎样执行?有优先级问题吗?

解决方案 »

  1.   

    楼主你最好不要同时使用多个timer
    有人说:
    主要原因是System.Windows.Forms以及System.Threading.Timer的Timer同时运行多个的时候会产生令人发狂的错乱,停止其中一个Timer的时候,可能会引发其他Timer注册的事件,对此类灵异事件,查遍互联网后只在MSDN发现了这么一段说明:由于所有 Timer 组件都在主应用程序线程上操作,所以在 Windows 窗体应用程序中的任意 Timer 上调用 Stop 都可以导致来自应用程序中其他 Timer 组件的消息被立即处理。如果有两个 Timer 组件,分别设置为 700 毫秒和 500 毫秒,并且从第一个 Timer 调用 Stop,则应用程序可能首先接收第二个组件的事件回调。如果这证明有问题,请考虑转为使用 System.Threading 命名空间中的 Timer 类。
      

  2.   

    Timer应该是单线程的,跟窗体同一线程,所以应该是轮流执行如果其中一个执行时间要很久,其它Timer也得等它执行完
      

  3.   

    请考虑转为使用 System.Threading 命名空间中的 Timer 类这个timer是在ThreadPool中处理事件的,你可以放心用
      

  4.   

    Timer应该是单线程的,也可以说是独占执行的。它里面的代码不会受别的Timer执行的影响,所以你的想法不会实现。
      

  5.   

     System.Timers.Timer timer1= new System.Timers.Timer();
     timer1.Elapsed += new System.Timers.ElapsedEventHandler(Method);
     timerUDRLThread.Interval = 10;//响应间隔
    private void Method(object sender, ElapsedEventArgs e)
    {
                //Todo      
    }
      

  6.   

    timerUDRLThread.Interval = 10;//响应间隔 
    改为
    timer1.Interval = 10;//响应间隔 
      

  7.   

    不要用多个timer ,无论是System.Windows .Forms .Timer还是System.Timers.Timer以下这个例子就可以说明,
    2个计时器都是100毫秒触发一次,
    但第一个timer里处理时间>100毫秒,这里用sleep1秒模拟,
    这样应该1秒后a=1,而b=10,但结果是a和b相差无几,
    说明第2个计时器被阻塞了,
    用System.Windows .Forms .Timer更明显using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication7
    {
        public partial class Form1 : Form
        {
            int a = 0, b = 0;
            public Form1()
            {
                InitializeComponent();            System.Timers.Timer timer1 = new System.Timers.Timer();
                timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
                timer1.Interval = 100;
                timer1.Enabled = true;            System.Timers.Timer timer2 = new System.Timers.Timer();
                timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed);
                timer2.Interval = 100;
                timer2.Enabled = true;
            }        void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                ++a;
                this.Invoke(new Action(X)); 
                System.Threading.Thread.Sleep(1000);
            }
            void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                b++;
                this.Invoke(new Action(X));
            }        void X()
            {
                this.Text ="a:"+ a.ToString() + " b:"+b.ToString();
            }
        }
    }
      

  8.   


    先声明一个方法用于Timer事件回调
    public void timerCallback(object stat)
    {
    }然后System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(tim),null,0,5000);这样计时器timer将立即触发一次timerCallback,之后每5000毫秒再触发一次
      

  9.   

     你在timer的事件里写个死循环  看看主窗体还能不能用?
           杞人忧天