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 吧
换成 System.Timer 吧
#2
思路混乱,你在线程里面不短的new定时器干什么,这不是找死机吗?
#3
MessageBox.Show("aa");
改成一窗体showmodal
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
改成一窗体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 吧
换成 System.Timer 吧
#2
思路混乱,你在线程里面不短的new定时器干什么,这不是找死机吗?
#3
MessageBox.Show("aa");
改成一窗体showmodal
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
改成一窗体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