zoukankan      html  css  js  c++  java
  • C# 三个定时器区别

    微软官方对C#常用定时器的解释:

    • System.Timers.Timer, 它将触发事件, 并定期在一个或多个事件接收器中执行代码。 类旨在用作多线程环境中基于服务器的组件或服务组件;它没有用户界面, 在运行时不可见。
    • System.Threading.Timer, 它按固定的时间间隔对线程池线程执行单个回调方法。 回调方法是在实例化计时器时定义的, 无法更改。 System.Timers.Timer与类一样, 此类应在多线程环境中用作基于服务器的或服务组件; 它没有用户界面, 在运行时不可见。
    • System.Windows.Forms.Timer(仅 .NET Framework) 是一个 Windows 窗体组件, 该组件在一个或多个事件接收器中定期执行事件并执行代码。 组件没有用户界面, 旨在在单线程环境中使用;它在 UI 线程上执行。

    一、System.Windows.Forms.Timer

    设置定时器的间隔时间1000毫秒:

    timerWinForm.Interval = 1000;

    启动定时器,等待1000毫秒后,触发事件,调用对应得事件接收器函数。

    timerWinForm.Enabled = true;

    假设定时器的事件接收器函数为:

    Console.WriteLine("test");

    System.Threading.Thread.Sleep(5000);

    定时器启动一秒后,执行事件接收器函数。

    接收器函数执行期间,不会响应定时器接收到的事件。

    接收器函数执行结束后,定时器才再次接收事件。

    二、System.Threading.Timer

    使用回调方法,由线程池线程提供服务,使用TimerCallback类型的回调函数。

    创建计时器时,可以指定在第一次执行方法之前要等待的时间,以及在后续执行之间等待的时间量(即执行周期)。可以使用Change方法更改截止时间和期限,或禁用计时器。如果线程池上的所有线程都被使用了,则回调函数需要排队。

    三、System.Timers.Timer

    固定时间触发一个事件信号,该事件调用事件接收器函数。

    如果SynchronizingObject属性为空,那么Elapsed事件会在线程池中开启一个线程。如果Elapsed事件处理的时间大于间隔时间,事件信号也会在间隔时间后再次被触发,所以事件句柄应该是可重入的。

    注意:事件处理运行在一个线程,同时在另外一个线程里面调用Stop方法或设置Enable属性变为false。这可能导致计时器停止后引发Elapsed事件。Stop方法的示例代码显示了一种避免这种竞争情况的方法。

    即使SynchronizingObject属性不为null,如果设置为当前的From对象,则Elapsed事件只会在主线程中触发调用。在调用Dispose或Stop方法后或Enabled属性被设置为false后,Elapsed事件也可以发生,因为引发Elapsed事件的信号总是在线程池上的线程队列中排队。解决这种竞争条件的一个方法就是只用标志位。使用标志位判断是否需要忽略后续的事件。

    此时等价于System.Windows.Forms.Timer

  • 相关阅读:
    多个在线参考手册,值得收藏
    DIV层,点“+”展开,“-”关闭
    网页设计标准尺寸
    【转】 大年三十整理的asp.net资料! (.NET) (ASP.NET)
    【转】xml操作
    【配色】web2.0 配色参考
    【转】关闭开机硬盘自检的方法
    【转】css的一些基础的东西
    web.config加密解密
    [转]用 Javascript 获取滚动条位置等信息
  • 原文地址:https://www.cnblogs.com/merlinzjl/p/12037298.html
Copyright © 2011-2022 走看看