WinForm程序,使用了Timer控件,每次时间到触发Elapsed 事件。现在的问题是,假如触发的Elapsed 事件需要处理很长的时间,可能在不断的存取数据库,需要花费1个小时,而程序运行了20分钟我想让Timer这个线程立刻停下来,该怎么做?如果执行Stop的话,也只是在Elapsed 事件完毕后不继续触发而已。如何能保证Timer的事件在运行时立刻停止呢?谢谢!

解决方案 »

  1.   

    多用一个Timer控件或多用几个Timer控件啦
    当一个事件触发的时候,某个Timer控件就开始计时,另外的某个Timer控件就停止
      

  2.   

    楼上的解决方案似乎和我需要的不一样?总之没明白,我是一个Timer在运行时需要立刻结束当前事件,不等待事件处理完,相当于立刻中止线程
    按你说的多用几个Timer控件,似乎是不能做到这样的,Timer可以停止,但仅能停止不再计时触发,但是已经开始的触发是会继续运行结束的
      

  3.   

    在timer事件里启动线程。用线程做想做的事情。想停止的时候直接kill掉不过操作数据库的时候最好在循环里设标志位,停止之后关闭连接
      

  4.   

    不要用timer,自己用线程控制就行了~~~
      

  5.   

    如此看来只好先在Timer里用线程了
    不过我觉得Timer本事就是起一个线程,能否在主程序里得到它起的线程Kill掉呢?那样就不用在Timer事件内起线程了,不知道这样可以么
      

  6.   

    可以试试2。0里面那个单线程的进程控件,用线程不错的,但是很容易出错什么,没有明白,system.windows.form.timer??写出来看看嘛,lz和我有同样的需求
      

  7.   

    timer是不会另起线程的
    timer和主窗口的threadid相同private void Form1_Load(object sender, EventArgs e)
    {
       this.textBox1.Text = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }private void timer1_Tick(object sender, EventArgs e)
    {
       this.textBox2.Text = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }
      

  8.   

    TO vosov :
    Timer是会起一个线程的吧,不过我不知道它们的线程id为什么相同。
    按照MSDN的说法,Timer触发的Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。
    我的程序里Timer触发的Elapsed 事件是非常耗时的,不过界面没停止响应,所以应该不是一个线程上的,所以我考虑得到这个线程的可能性?