关于timer的疑问,在timer的Elapsed事件中new了一窗体,这个窗体显示后总是显示繁忙,如果改用委托的话,就不会了。这个是为什么?timer 不就是另开了一个线程吗,为什么会出现卡的情况?

解决方案 »

  1.   

    其实Timer控件的原理就是利用了线程,首先设置一个 tick ,也就是没过多少毫秒执行一次 Timer 事件。至于Timer事件就是你想要做的事了。
      

  2.   

    恩,这个我知道。我的意思是:在timer中每过3秒显示一个窗体,窗体是显示了,但是窗体中的按钮都用不了;但是把显示窗体的代码放到委托中,窗体的按钮就可以用了。用的this.invoke(委托);我的意思是,timer就是另开了一个线程啊,而委托也是委托给timer线程。为什么委托就能实现效果了呢
      

  3.   

     void alarmTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {            alarmTimer.Enabled = false;            //foreach (DataRow dr in NotesDt.Rows)
                //{
                //    try
                //    {
                //        if (dr["IsAlarm"].ToString().Equals("提醒") && dr["NoteTime"].ToString().Equals(DateTime.Now.ToString()))// (int)(DateTime.Parse(dr["NoteTime"].ToString()).Ticks - DateTime.Now.Ticks) < 2)
                //        {
                //            if (myAlarmForm == null || !myAlarmForm.IsHandleCreated)
                //            {
                //                myAlarmForm = new AlarmForm();
                //            }
                //            myAlarmForm.Activate();
                //            myAlarmForm.changNote(dr["NoteText"].ToString());
                //            myAlarmForm.Show();
                //            myAlarmForm.Refresh();
                //            myAlarmForm.MoveForm();
                           
                //        }
                //    }
                //    catch
                //    { }
                //}
                this.Invoke(myShowNote);
                alarmTimer.Enabled = true;
            }
    代码就是这样了