System.Timers.Timer和System.Windows.Forms.Timer是有区别的。
我一个是非堵塞的,一个不是。更重要的的System.Timer是多线程的,如果控制不好执行时间的话,线程数会不断的增加。
测试代码:
public partial class Form1 : Form
{
private System.Timers.Timer timer;
private System.Windows.Forms.Timer timer2;
private int incount;
private int outCount;
public Form1()
{
InitializeComponent();
this.timer = new System.Timers.Timer();
this.timer.Interval = 100;
this.timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);
this.timer.Enabled = false;
this.timer2 = new System.Windows.Forms.Timer();
this.timer2.Interval = 100;
this.timer2.Enabled = false;
this.timer2.Tick+=new EventHandler(timer2_Tick);
}
#region System.Timers.Timer测试
private void button1_Click(object sender, EventArgs e)
{
this.timer.Enabled = true;
incount = 0;
outCount = 0;
}
private void button2_Click(object sender, EventArgs e)
{
this.timer.Enabled = false;
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Console.WriteLine(
String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
e.SignalTime, incount, outCount, (DateTime.Now - e.SignalTime).TotalMilliseconds));
if (incount >= 30) { timer.Enabled = false; return; }
incount = incount + 1;
DoWork(e);
}
private void DoWork(ElapsedEventArgs e)
{
System.Threading.Thread.Sleep(5000);
outCount = outCount + 1;
System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
e.SignalTime, incount, outCount, (DateTime.Now - e.SignalTime).TotalMilliseconds));
System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
#endregion
#region System.Windows.Forms.Timer测试
private DateTime preDateTime;
private void DoWork2()
{
System.Threading.Thread.Sleep(5000);
outCount = outCount + 1;
System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
preDateTime, incount, outCount, (DateTime.Now - preDateTime).TotalMilliseconds));
System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
private void timer2_Tick(object sender, EventArgs e)
{
this.preDateTime = DateTime.Now;
System.Console.WriteLine("#T" + System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Console.WriteLine(String.Format("--->timestamp:{0}, incount/outcount: {1}/{2} ,i={3}",
preDateTime, incount, outCount, (DateTime.Now - preDateTime).TotalMilliseconds));
if (incount >= 30) { timer.Enabled = false; return; }
incount = incount + 1;
DoWork2();
}
private void button3_Click(object sender, EventArgs e)
{
this.timer2.Enabled = true;
incount = 0;
outCount = 0;
}
private void button4_Click(object sender, EventArgs e)
{
this.timer2.Enabled = false;
}
#endregion
}
执行测试一:
--->timestamp:2014-03-14 11:32:06, incount/outcount: 15/5 ,i=5001.2861
#T15
#T15
--->timestamp:2014-03-14 11:32:11, incount/outcount: 15/5 ,i=0
#T22
--->timestamp:2014-03-14 11:32:11, incount/outcount: 16/5 ,i=0
--->timestamp:2014-03-14 11:32:06, incount/outcount: 17/6 ,i=5000.286
#T16
#T16
--->timestamp:2014-03-14 11:32:11, incount/outcount: 17/6 ,i=0
--->timestamp:2014-03-14 11:32:07, incount/outcount: 18/7 ,i=5000.286
#T17
#T17
--->timestamp:2014-03-14 11:32:12, incount/outcount: 18/7 ,i=0
--->timestamp:2014-03-14 11:32:07, incount/outcount: 19/8 ,i=5000.286
#T18
#T18
--->timestamp:2014-03-14 11:32:12, incount/outcount: 19/8 ,i=0
--->timestamp:2014-03-14 11:32:08, incount/outcount: 20/9 ,i=5001.2861
#T19
#T19
--->timestamp:2014-03-14 11:32:13, incount/outcount: 20/9 ,i=0
--->timestamp:2014-03-14 11:32:09, incount/outcount: 20/10 ,i=5000.286
#T20
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/11 ,i=5000.286
#T21
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/12 ,i=5000.286
#T6
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/13 ,i=5000.286
#T12
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/14 ,i=5000.286
#T13
--->timestamp:2014-03-14 11:32:10, incount/outcount: 20/15 ,i=5000.286
#T14
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/16 ,i=5000.286
#T15
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/17 ,i=5000.286
#T22
--->timestamp:2014-03-14 11:32:11, incount/outcount: 20/18 ,i=5000.286
#T16
--->timestamp:2014-03-14 11:32:12, incount/outcount: 20/19 ,i=5000.286
#T17
--->timestamp:2014-03-14 11:32:12, incount/outcount: 20/20 ,i=5000.286
#T18
5000/100为最大峰值为10个并发,如果间隔为1000为一半左右,我这个搞不明白,也没有心情算。
测试2:
#T10
--->timestamp:2014-03-14 11:37:52, incount/outcount: 0/0 ,i=0
--->timestamp:2014-03-14 11:37:52, incount/outcount: 1/1 ,i=5001.2861
#T10
#T10
--->timestamp:2014-03-14 11:37:57, incount/outcount: 1/1 ,i=0
--->timestamp:2014-03-14 11:37:57, incount/outcount: 2/2 ,i=5000.286
#T10
#T10
--->timestamp:2014-03-14 11:38:02, incount/outcount: 2/2 ,i=0
--->timestamp:2014-03-14 11:38:02, incount/outcount: 3/3 ,i=5000.286
#T10
#T10
--->timestamp:2014-03-14 11:38:07, incount/outcount: 3/3 ,i=0
为单线程,而且执行的时候堵塞UI线程,在执行的时候鼠标Sleep,timer间隔期不等待。