知识大全 .Net框架类库中定时器类的使用[2]

Posted

篇首语:学者之所以是学者,不是因为他博学,而是因为他一直保有求知欲。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .Net框架类库中定时器类的使用[2]相关的知识,希望对你有一定的参考价值。

技巧:.Net框架类库中定时器类的使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  对System Windows Forms Timer的编程不能再简单了——它有一个非常简单和可直接编程的接口 Start和Stop方法实际上提供了一个设置使能属性的改变方法(其本身是对Win ?的SetTimer和KillTimer功能的一个包装) 我刚才提到的间隔属性 名字本身就说明了问题 即使技术上你可以设置间隔属性低到 毫秒 但你应该知道在 NET框架文档中指出这个属性大约精确到 毫秒(假定UI线程对于处理是可用的)

  捕捉由System Windows Forms Timer类实例引发的事件是通过感知一个标准的EventHandler委托的标记事件来处理的 就像下面的代码片断所示

System Windows Forms Timer tmrWindowsFormsTimer = new System Windows Forms Timer();tmrWindowsFormsTimer Interval = ;tmrWindowsFormsTimer Tick += new EventHandler(tmrWindowsFormsTimer_Tick);tmrWindowsFormsTimer Start(); private void tmrWindowsFormsTimer_Tick(object sender System EventArgs e) //Do something on the UI thread   System Timers Timer

   NET框架文档指出System Timers Timer类是一个服务器定时器 是为多线程环境进行设计和优化 该定时器类的实例能够被多个线程安全地访问 不像System Windows Forms Timer System Timers Timer缺省的 将在一个工作者线程上调用你的定时器事件处理函数 该工作者线程是从公共语言运行时(CLR)线程池中获得 这意味着在你的逝去的时间处理函数代码中必须遵从Win 编程的黄金规则 除了创建该控件实例的线程之外 一个控件的实例从来不被任何其它的线程所访问

  System Timers Timer提供了一个简单的方法处理这样的困境——暴露一个公共的SynchronizingObject属性 把该属性设置为一个窗体实例(或者窗体上的一个控件)将保证你的事件处理函数代码运行在SynchronizingObject被实例化的同一个线程里

  如果你使用了Visual Studio NET工具箱 Visual Studio NET自动的设置SynchronizingObject属性为当前的窗体实例 首先它设定该定时器的SynchronizingObject属性使其在功能上同System Windows Forms Timer类一样 对于大部分功能 的确是这样 当操作系统通知System Timers Timer类所允许的定时时间已过去 定时器使用SynchronizingObject Begin Invoke方法在一个线程上去执行事件委托 该线程是创建SynchronizingObject的线程 事件处理函数将被阻塞直到UI线程能够处理它 然而不像System Windows Forms Timer类一样 该事件最终仍然能够被引发 像你在Figure 中看到的 当UI线程不能够处理时System Windows Forms Timer不会引发事件 可是当UI线程可用时System Timers Timer却会排队等候处理

  Figure 是如何使用SynchronizingObject属性的例子 使用例子程序并通过选择System Timers Timer的radio按钮你可以分析这个类 并按照执行System Windows Forms Timer类行为的同样顺序运行该类 这样就会产生Figure 的输出结果

  正如你所看到的 它不会跳过一个跳动——即使UI线程在睡眠 在每一个事件间隔就有一个时间消失事件处理会被排队执行 因为UI线程在睡眠 所以当UI线程一旦被唤醒例子程序就会列出 个定时器事件( 到 )并能够处理处理函数

  正如我早先提到的 System Timers Timer类成员非常类似与System Windows Forms Timer 最大的区别就在与System Timers Timer类是对Win 可等待定时对象的一个包装 并在工作者线程上产生一个时间片消失事件而不是在UI线程上产生一个时间标记事件 时间片消失事件必须与一个同ElapsedEventHandler委托像匹配的事件处理函数相连接 事件处理函数接受一个ElapsedEventArgs类型的参数

  除了标准的EventArgs成员 ElapsedEventArgs类暴露了一个公共的SignalTime属性 它包含了一个精确的定时器时间片消失的时间 因为这个类支持不同线程的访问 除了时间消失事件所在的线程 应该相信它的Stop方法能够被其它线程所调用 这会潜在的导致消失事件被引发即使其Stop方法已经被调用 你可以把SignalTime和Stop方法调用的时间进行比较来解决这个问题

  System Timers Timer也提供了AutoReset属性来决定当时间片消失事件引发后是继续进行还是只这一次 要记住在定时器开始后重设间隔属性会导致当前计数为 比如 设置了一个 秒的间隔 在间隔被改变为 秒时 秒已经过去了 那么下一个定时器事件将会在上一个定时器事件 秒后发生

 System Threading Timer

  第三个定时器类来自System Threading名字空间 我愿意说这是所有定时器类中最好的一个 但这会引起误导 举一个例子 我惊讶的发现对于驻留在System Threading名字空间的这个类天生就不是线程安全的 (很明显 这不意味着它不能以线程安全的方式使用) 这个类的可编程接口同其它两个类也不一致 它稍微有点麻烦

cha138/Article/program/net/201311/15304

相关参考

知识大全 .Net框架类库中定时器类的使用[1]

技巧:.Net框架类库中定时器类的使用[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不论

知识大全 .Net框架类库中定时器类的使用[3]

技巧:.Net框架类库中定时器类的使用[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不像

知识大全 .Net框架类库中定时器类的使用[4]

技巧:.Net框架类库中定时器类的使用[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Sh

知识大全 从.NET类库代码来看ASP.NET运行时[2]

从.NET类库代码来看ASP.NET运行时[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n

知识大全 在开发中.net类库中发送电子邮件[2]

  二net中的做法  代码usingSystem;usingSystemNetMail;usingSystemNet;///<summary>///说明在net以上版本中发送电子邮件的方

知识大全 .net知识结构

  NET介绍微软NET战略及技术体系NETFramework框架类库(FCL)公共语言运行时(CLR)通用类型系统(CTS)公共语言规范(CLS)程序集(Assembly)应用程序域(Applica

知识大全 用反射调用任意.net库中的方法

注:ReturnMessage是我自写的一个类作用请查看我的其他文章我也把这个类一并附在后面通过NameSpaceAndClassName和MethodName实际上就可以精确定位一个方法了如调用ab

知识大全 从.NET类库代码来看ASP.NET运行时[1]

从.NET类库代码来看ASP.NET运行时[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n

知识大全 ASP.NET上的ReCAPTCHA类库

ASP.NET上的ReCAPTCHA类库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  reCA

知识大全 ADO.NET的一个帮助类库

ADO.NET的一个帮助类库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ADONET的一个帮