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的效果一样:长调用将会阻塞界面。

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

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

例说多线程定时器System.Timers.Timer

System.Timers.Timer是多线程定时器,如果一个Timer没有处理完成,到达下一个时间点,新的Timer同样会被启动,所以在使用Timer时需要注意。下面的实例显示了Timer的使用方法...
  • tiana0
  • tiana0
  • 2016年05月08日 17:07
  • 9928

C#多线程 定时重复调用异步线程即System.Threading.Timer类使用小例

1.System.Threading.Timer计时器提供了一种重复调用异步线程的方法。.Net BCL中有多个Timer类,如用于Windows应用程序的System.Windows.Forms.T...
  • xuanwuziyou
  • xuanwuziyou
  • 2014年12月05日 10:59
  • 7170

System.Timers.Timer是多线程定时器

System.Timers.Timer是多线程定时器,如果一个Timer没有处理完成,到达下一个时间点,新的Timer同样会被启动,所以在使用Timer时需要注意。  下面的实例显示了Timer的使...
  • NCTU_to_prove_safety
  • NCTU_to_prove_safety
  • 2017年07月25日 00:54
  • 290

C# 多线程操作控件

C# 多线程操作控件。 using System; using System.Collections.Generic; using System.ComponentModel; using Sy...
  • e421083458
  • e421083458
  • 2014年12月30日 19:15
  • 1040

C#中System.Timers.Timer定时器的elapsed函数传递参数

笔者最近在使用System.Timers.Timer类时,对于如何在Elapsed事件触发时向事件处理函数传递参数存在一些疑惑,后来总算解决了相关问题。总结如下: 1.匿名函数传递 使用L...
  • shellykenan
  • shellykenan
  • 2016年09月13日 19:45
  • 3471

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

System.Timers.Timer
  • qq_18995513
  • qq_18995513
  • 2017年03月02日 09:17
  • 316

Unity定时器Timer类

本文只作为参考,个人水平有限,望见谅! 在写代码的时候经常碰到过一定时间之后执行某个方法的情况,刚开始时会定义一个bool值和一些时间count进行时间上的判断,于是乎就出现了许多的变量,时间一长...
  • zzmkljd
  • zzmkljd
  • 2016年10月14日 16:00
  • 2374

==和===有什么区别

”==”与”===”是不同的,一个是判断值是否相等,一个是判断值及类型是否完全相等。 下面的规则用于判定===运算符比较的两个值是否相等的判断条件 •如果两个值的类型不同,它们就不相同。 •如果...
  • lmwyc123
  • lmwyc123
  • 2015年07月16日 22:55
  • 1533

js ==与===区别

1、对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 2)同类型比较,直...
  • WXDZXL
  • WXDZXL
  • 2013年01月14日 18:35
  • 11966
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:System.Windows.Forms.Timer和System.Timers.Timer的区别
举报原因:
原因补充:

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