在写应用程序中经常需要使用到时间间隔循环,这时,我们经常会考虑使用定时器。
C#为我们提供了多种定时器的解决方法,有timer控件,thread.timer. 以及timers.timer
这里只做了timer控件和timers.timer的对比。
前者使用方便操作灵活,在事件响应函数中可以对其他控件直接进行操作。用再windows开发中非常好用,
但是如果使用超过两个,并且在响应函数中有过多的计算和操作时。界面上就会很明显看到时间间隔与设定不一致。
实例代码:
public partial class Form1 : Form
{
int num = 0;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
textBox1.Text = Convert.ToString((++num));
timer1.Enabled = true;
}
private void timer2_Tick(object sender, EventArgs e)
{
textBox2.Text = Convert.ToString(DateTime.Now);
Thread.Sleep(3000);
Application.DoEvents();
}
private void timer3_Tick(object sender, EventArgs e)
{
textBox3.Text = Convert.ToString(DateTime.Now);
Thread.Sleep(3000);
Application.DoEvents();
}
private void timer4_Tick(object sender, EventArgs e)
{
textBox4.Text = Convert.ToString(DateTime.Now);
Thread.Sleep(3000);
Application.DoEvents();
}
这在里面我们会发现,timer1的定时器中num的值变化不正常。
使用timers.timer则比较好的解决这个问题唯一不足的就是,在timer的事件响应函数中不能直接对其他控件进行操作,只能使用委托代理的方式。
实例:
int num = 0;
System.Timers.Timer myPLCTimer1 = new System.Timers.Timer();
System.Timers.Timer myPLCTimer2 = new System.Timers.Timer();
System.Timers.Timer myPLCTimer3 = new System.Timers.Timer();
System.Timers.Timer myPLCTimer4 = new System.Timers.Timer();
public Form1()
{
InitializeComponent();
myPLCTimer1.Interval = 500;
myPLCTimer2.Interval = 500;
myPLCTimer3.Interval = 500;
myPLCTimer4.Interval = 500;
myPLCTimer1.Elapsed += new System.Timers.ElapsedEventHandler(myPLCTimer1_Elapsed);
myPLCTimer2.Elapsed += new System.Timers.ElapsedEventHandler(myPLCTimer2_Elapsed);
myPLCTimer3.Elapsed += new System.Timers.ElapsedEventHandler(myPLCTimer3_Elapsed);
myPLCTimer4.Elapsed += new System.Timers.ElapsedEventHandler(myPLCTimer4_Elapsed);
myPLCTimer1.Enabled = true;
myPLCTimer2.Enabled = true;
myPLCTimer3.Enabled = true;
myPLCTimer4.Enabled = true;
myPLCTimer1.AutoReset = true;
myPLCTimer2.AutoReset = true;
myPLCTimer3.AutoReset = true;
myPLCTimer4.AutoReset = true;
}
void myPLCTimer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myPLCTimer1.Enabled = false;
Action<string> actionDelegate = delegate(string txt) { this.textBox1.Text = txt; };
this.textBox1.Invoke(actionDelegate, Convert.ToString((++num)));
myPLCTimer1.Enabled = true;
//Thread.Sleep(3000);
}
void myPLCTimer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myPLCTimer2.Enabled = false;
Action<string> actionDelegate = delegate (string txt) { this.textBox2.Text = txt; };
this.textBox2.Invoke(actionDelegate, Convert.ToString(DateTime.Now));
Thread.Sleep(3000);
myPLCTimer2.Enabled = true;
}
void myPLCTimer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myPLCTimer3.Enabled = false;
Action<string> actionDelegate = delegate (string txt) { this.textBox3.Text = txt; };
this.textBox3.Invoke(actionDelegate, Convert.ToString(DateTime.Now));
Thread.Sleep(3000);
myPLCTimer3.Enabled = true;
}
void myPLCTimer4_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
myPLCTimer4.Enabled = false;
Action<string> actionDelegate = delegate (string txt) { this.textBox4.Text = txt; };
this.textBox4.Invoke(actionDelegate, Convert.ToString(DateTime.Now));
Thread.Sleep(3000);
myPLCTimer4.Enabled = true;
}