在线程中不能触发定时器事件

时间:2022-12-22 00:08:40
我是用一个主程序调用一个Dll   System.Windows.Forms.Timer类型的定时器在Dll中,如果正常调用,就没问题,如果是开启一个新的线程调用dll,就不能触发定时器
dll的代码
class Class2
    {
        System.Windows.Forms.Timer timer1 = new Timer();
        public void aa()
        {
            timer1.Interval = 1000;
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Enabled = true;
        }

        void timer1_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("aa");
        }
    }



主程序的代码
private void button4_Click(object sender, EventArgs e)
        {
            Class1 c1 = new Class1();
            c1.aa();
        }
这样做就没问题,定时器可以触发,但是如果按照下面的代码就不行了
private void button4_Click(object sender, EventArgs e)
        {
            Class1 c1 = new Class1();
            Thread thread1 = new Thread(new ThreadStart(c1.aa));
            thread1.Start();
        }
或者是下面这样 也不行
 private void button4_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ThreadStart(func));
            thread1.Start();
        }
        void func()
        {
            Class1 c1 = new Class1();
            c1.aa();
        }

主程序按照上面的两段代码,在新线程中调用dll,就不能触发System.Windows.Forms.Timer类型的定时器,请问原因是什么啊?

9 个解决方案

#1


System.Windows.Forms.Timer 要求要有UI 消息泵, 所以通常只在主线程上使用。

换成 System.Timer 吧

#2


思路混乱,你在线程里面不短的new定时器干什么,这不是找死机吗? 在线程中不能触发定时器事件

#3


MessageBox.Show("aa"); 
改成一窗体showmodal
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#4


Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。建议使用System.Threading.Timer 

#5


用这个应该可以

System.Timers.Timer t;
t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒; 
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件; 
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
private void theout(object source, System.Timers.ElapsedEventArgs e)
{
///...
}

#6


用 system.timers.timer试试

#7


那当然,因为你的线程已经结束释放了么,内部定义的计时器也释放了么

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication19
{
    public partial class Form1 : Form
    {
        class Class1
        {
            System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
            public void aa()
            {
                timer1.Interval = 1000;
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Enabled = true;

                while (true)
                    Application.DoEvents();
            }

            void timer1_Tick(object sender, EventArgs e)
            {
                MessageBox.Show("aa");
            }
        }

        public Form1()
        {
            InitializeComponent();

            Class1 c1 = new Class1();
            Thread thread1 = new Thread(new ThreadStart(c1.aa));
            thread1.Start();

        }
    }
}


不过强烈不建议这么用

#8


我使用system.timers.timer分别在web和console测试了下。在console下测试ok.在web下根本不执行。望有高手指点迷津!

#9


可以用 AutoResetEvent

#1


System.Windows.Forms.Timer 要求要有UI 消息泵, 所以通常只在主线程上使用。

换成 System.Timer 吧

#2


思路混乱,你在线程里面不短的new定时器干什么,这不是找死机吗? 在线程中不能触发定时器事件

#3


MessageBox.Show("aa"); 
改成一窗体showmodal
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://feiyun0112.cnblogs.com/

#4


Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。建议使用System.Threading.Timer 

#5


用这个应该可以

System.Timers.Timer t;
t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒; 
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件; 
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
private void theout(object source, System.Timers.ElapsedEventArgs e)
{
///...
}

#6


用 system.timers.timer试试

#7


那当然,因为你的线程已经结束释放了么,内部定义的计时器也释放了么

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication19
{
    public partial class Form1 : Form
    {
        class Class1
        {
            System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
            public void aa()
            {
                timer1.Interval = 1000;
                timer1.Tick += new EventHandler(timer1_Tick);
                timer1.Enabled = true;

                while (true)
                    Application.DoEvents();
            }

            void timer1_Tick(object sender, EventArgs e)
            {
                MessageBox.Show("aa");
            }
        }

        public Form1()
        {
            InitializeComponent();

            Class1 c1 = new Class1();
            Thread thread1 = new Thread(new ThreadStart(c1.aa));
            thread1.Start();

        }
    }
}


不过强烈不建议这么用

#8


我使用system.timers.timer分别在web和console测试了下。在console下测试ok.在web下根本不执行。望有高手指点迷津!

#9


可以用 AutoResetEvent