浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础 下2011-08-03 博客园 lovecindywang在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI 线程上操作控件,否则很容易产生人品问题。可以想到,上次介绍的两个Timer基于ThreadPool,回调方 法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行 Invoke或BeginInvoke。其实,还有 第三种System.Windows.Forms.Timer,它可以让回调事件在UI线程上执行,我们来做一个实验比较一下 System.Windows.Forms.Timer和System.Timers.Timer。在一个窗体上新建两个标签控件,然后来创建两 个计时器:
private System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer ();
private System.Timers.Timer timer2 = new System.Timers.Timer();
public Form2()
{
   InitializeComponent();
}双击表单,在Load事件中写如下代码:
this.Text = string.Concat("#", Thread.CurrentThread.ManagedThreadId);
//timer2.SynchronizingObject = this;
timer2.Interval = 1000;
timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed);
timer2.Enabled = true;
timer1.Interval = 1000;
timer1.Tick += new System.EventHandler(this.timer1_Tick);
timer1.Enabled = true;然后是两个计时器的处理方法:
private void timer1_Tick(object sender, EventArgs e)
{
   label1.Text = string.Format("timer1 : #{0} {1} {2}",  Thread.CurrentThread.ManagedThreadId, this.InvokeRequired, DateTime.Now.ToString());
}
private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
   label2.Text = string.Format("timer2 : #{0} {1} {2}",  Thread.CurrentThread.ManagedThreadId, this.InvokeRequired, DateTime.Now.ToString());
}以非调试方式运行程序,可以看到如下的结果:
