今天在写程序时用timer组件(定义在System.Windows.Forms里 )时遇到一个问题,当我新建一个线程启动这个线程后timer控件的
事件就不响应了,在网上查了一下timer分下面三种情况
结果我把timer控件删掉,用了第二第三种问题解决了特附上自己的测试代码和网上收的程序
·关于C#中timer类 在C#里关于定时器类就有3个
1.定义在System.Windows.Forms里
2.定义在System.Threading.Timer类里
3.定义在System.Timers.Timer类里
System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。
System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。
自己代码
system.Timers.Timer t = new System.Timers.Timer(600);//实例化Timer类,设置间隔时间为600毫秒;
private bool flag = false;
private int time = 0;//记录重发的次数(最多发三次)
private Thread thread = null;
private Thread threadAcc = null;
private DateTime dTime = DateTime.Now;
private static ManualResetEvent myReset = new ManualResetEvent(false);
public Form1()
{
InitializeComponent();
}
//Timer触发的事件
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
//MessageBox.Show("OK!");
string dateDiff = null;
TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
TimeSpan ts2 = new TimeSpan(dTime.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
dateDiff = ts.Seconds.ToString();
//判断时间和标记
if (!flag && Convert.ToInt16(dateDiff) > 15 && time < 3)
{
int a = 1;
time++;
}
}
/// <summary>
/// 线程同步方法
/// </summary>
private void target()
{
#region
while (true)
{
myReset.Reset(); //设为非终止
Thread.Sleep(800);// 休眠时间0.8秒等待接收结束
threadAcc = new Thread(new ThreadStart(shoot));
threadAcc.Start();
//调用新的线程
//myReset.WaitOne(); //阻塞当前线程,直到收到请求信号
}
#endregion
}
void shoot()
{
flag = true;
//timer1.Stop();
timer1.Enabled = false ;
t.Enabled = false;
int b = 0;
if(b==1)
{
dTime = DateTime.Now;
flag = false;
//timer1.Start();
timer1.Enabled = true;
t.Enabled = true;
}
}
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(target));
thread.Start();
dTime = DateTime.Now;
flag = false;
//timer1.Start();
timer1.Enabled = true;
t.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Enabled = false;//是否执行System.Timers.Timer.Elapsed事件;
}
网上实例
例:
使用System.Timers.Timer类
System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;
t.Elapsed = new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;
t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
Form中的应用起来就更简单了
使用Timer类可以定时触发你所定义的方法。本文介绍使用Timer类的具体步骤
using System.Threading;
using System.Timers;
1 创建计时器的新实例:
System.Windows.Form.Timer aTimer = new System.Windows.Form.Timer();
2 指定事件处理程序:
aTimer.Tick += new EventHandler(OnTimer);
3 指定引发事件的频率:
aTimer.Interval = 1000;
4 启用组件:
aTimer.Enabled = true;
5 处理事件:
public static void OnTimer(Object source, EventArgs e) {
Console.WriteLine("Hello World!");
}