System.Windows.Forms.Timer和System.Timers.Timer的区别

原创 2011年01月15日 09:10:00
.NET Framework里面提供了三种Timer: •System.Windows.Forms.Timer •System.Timers.Timer •System.Threading.Timer Visual Studio 2003的工具箱里面默认提供了System.Windows.Forms.Timer和System.Timers.Timer两种,而Visual Studio 2005中确只默认提供了System.Windows.Forms.Timer这一种。这里简单的介绍一下这两种Timer的区别。 System.Windows.Forms.Timer是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。也正是因为这个原因,导致了在Timer的EventHandler里面进行长时间的阻塞调用,将会阻塞界面响应的后果。下面是一个简单的例子: public class MainForm : Form { private void MainForm_Load(object sender, EventArgs e) { timer.Interval = 1000; timer.Tick += delegate(object o, EventArgs args) { DoWork(); }; timer.Start(); } private void DoWork() { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); } } System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); } 在这个例子中,DoWork方法里面将会阻塞10秒,在这10秒之内,UI将会失去响应。而通过使用System.Timers.Timer,就可以解决这个问题。因为System.Timers.Timer是在.NET的Thread Pool上面运行的,而不是直接在UI Thread上面运行,所以在这种Timer的EventHandler里面进行耗时较长的计算不会导致UI失去响应。但是这里有两个地方需要注意: 1.因为一般来说System.Timers.Timer不是运行在UI Thread上面的,所以如果要在这种Timer的EventHandler里面更新UI元素的话,需要进行一次线程切换,在WinForm开发中一般通过UI元素的Invoke方法完成: private void DoWork() { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); } this.Invoke(new UpdateUICallBack(UpdateUI)); } private delegate void UpdateUICallBack(); private void UpdateUI() { } 2.System.Timers.Timer有一个Property:SynchronizingObject 。如果设置了这个Property(一般是某个Form),那么之后对Timer挂接的EventHandler的调用将会在创建这个UI元素的线程上进行(一般来说就是UI线程)。值得注意的是,如果你通过WinForm设计器把System.Timers.Timer拖放到Form上,那么这个Property将会自动被设置。此时这种Timer就和System.Windows.Forms.Timer的效果一样:长调用将会阻塞界面。

相关文章推荐

System.Timers.Timer与System.Windows.Forms.Timer 区别

根据msdn解释:System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。 不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行...

System.Windows.Forms.Timer与System.Timers.Timer的区别

2008-11-19 20:07488人阅读评论(0)收藏举报 一、引言     在 Visual Studio .NET 中有两种计时器控件——基于服务器的计时器和标准的基于 Windows...
  • sjj2011
  • sjj2011
  • 2012年07月17日 12:34
  • 871

System.Timers.Timer 定时执行

C#代码 1.在Global.asax文件中导入命名空间 2.Global.asax文件中的Application_Start()方法内写如下代码: System.Tim...
  • stardtx
  • stardtx
  • 2012年03月01日 16:12
  • 859

【C#/WPF】用System.Timers.Timer计时器做浮窗广告

System.Timers.Timer

System.Timers.Timer

Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务器,必须每周7 天、每天24 小时都...

.NET System.Timers.Timer的原理和使用(开发定时执行程序)

概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务器,必...

Forms.Timer、Timers.Timer、Threading.Timer的区别有哪些

 一、System.Windows.Forms.Timer 1、基于Windows消息循环,用事件方式触发,在界面线程执行;是使用得比较多的Timer,Timer Start之后定时(...
  • whazhl
  • whazhl
  • 2014年09月25日 13:24
  • 530

C#关于System.Timer的用法

  • 2016年06月28日 16:34
  • 290KB
  • 下载

System.Thread.Timer定时器的使用

转自:http://blog.sina.com.cn/s/blog_3f0612650100grr6.htmlSystem.Thread;中的Timer定时器的使用。http://kb.cnblogs...

C#构建多线程应用程序(5) —— 使用System.Threading.Timer

许多程序需要定期调用具体的方法,这种情况下可以使用System.Threading.Timer类型和相关的TimerCallback委托来实现。注意不要和System.Timer混淆了。System....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:System.Windows.Forms.Timer和System.Timers.Timer的区别
举报原因:
原因补充:

(最多只允许输入30个字)