zoukankan      html  css  js  c++  java
  • .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下
     
     

    在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行选择确实是一个问题。

    总体而言,计时器共有以下四种:

    多线程计时器:

    1 System.Threading.Timer
    2 System.Timers.Timer

    特殊环境的单线程计时器:

    1 System.Windows.Forms.Timer(使用环境:Windows Forms Timer)
    2 System.Windows.Threading.DispatcherTimer( 使用环境:WPF timer);

    单线程计时器比较安全, 因为运行在主线程中,对于更新 Windows Forms或者WPF 中控件的值 这种简单任务来说更方便。 例如时钟和计数显示。否则,你需要一个多线程计时器。

    原理:单线程使用消息循环机制,这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。

    示例代码如下:

    public static void Main()
    {
    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
    tmr.Tick += new EventHandler(tmr_Tick);
    tmr.Start();//开始计时器
    tmr.Stop();//停止计时器
    tmr.Enabled =true;//设置或获取计时器是否正在运行
    tmr.Interval = 10000; //计时器的时间间隔 (10秒),以毫秒为单位,在计时器事件tmr_Tick开始10秒后进行第一次执行.
    }
    void tmr_Tick(object sender, EventArgs e)
    {
      //到达指定时间间隔应处理的代码
    }

    多线程计时器比较强大,精确,而且可扩展性强;使用多线程计时器时不会对主线程造成任何影响,也就不会出现上面图片显示的情况.

    原理:多线程计时器使用回调方法并由线程池线程提供服务.当计时器间隔小于执行此回调(Tick方法)所需的时间时,回调可以同时在多个线程中执行,比如当计时器的时间间隔是5秒,但过了5秒后,上一次的回调仍未完成,此时新的回调将在新的线程中运行.在开发中需要避免此种情况。

    System.Threading.Timer是最简单的多线程计时器。
    只要在使用 System.Threading.Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。
     
    在下面的例子中,计时器在5秒后开始定时1秒的调用Tick方法。

    public static void Main()
    {
    int duetime = 5000;
    int period = 1000;
    System.Threading.Timer timer = new System.Threading.Timer(Tick,"给Tick方法传的参数,object类型",duetime ,period );
    duetime = 10000;
    period = 2000;
    //修改等待时间为10秒和间隔时间为2秒
    timer.Change(duetime, period);
    //取消计时器
    timer.Dispose();
    }
    static void Tick(object data)
    {
     Console.WriteLine(data);
    //如果此时需要访问控件,因为回调线程跟主线程是完全不同的两个线各,因此需要使用Control.Invoke或BeginInvoke方法,来实现,例如:
    this.BeginInvoke((MethodInvoker)delegate()
    {
      this.lbl_w.Text = data.ToString ();
     });
    }

    .net framework提供的另一个计时器System.Timers.Timer.简单的对System.Threading.Timer进行了包装。增加了下面几个特性:

    1.实现了Component,所以可以在设计器显示。
    2.用Interval属性代替代替Change方法
    3.添加了Elapsed事件, 启动和停止timer的Start和Stop方法。
    4.添加了AutoReset属性 默认为True 来指定是否在每次指定的间隔结束时引发Elapsed事件,还是仅运行一次Elapsed事件就结束

    示例代码如下:

    public static void MainThread()
    {
     System.Timers.Timer Timer tmr=new System.Timers.Timer();
     tmr.Interval=500;
     tmr.Elapsed+=newElapsedEventHandler(tmr_Elapsed);
     tmr.AutoReset = false;
     tmr.Start();
     Console.ReadLine();
     tmr.Stop();
     Console.ReadLine();
     tmr.Dispose();
    }
    void tmr_Elapsed(objectsender,ElapsedEventArgse)
    {
     Console.WriteLine("Tick...");
    }

    结论:
    WPF和Windows Forms的单线程计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。
    否则,你只能使用多线程计时器,对于使用哪一种多线程计时器,可根据自己的需要来决定

    希望本文所述对大家掌握.net中timer的用法有所帮助。

  • 相关阅读:
    安装好php后找不到php.ini
    Nginx 和 PHP 的两种部署方式比较
    高性能Web服务之lnmp架构应用
    >/dev/null 2>&1的含义
    LC_ALL=C的含义
    深入理解PHP Opcode缓存原理
    iostat 监视I/O子系统
    sar 找出系统瓶颈的利器
    Linux常用命令汇总
    linux增加自定义path和manpath
  • 原文地址:https://www.cnblogs.com/mili3/p/4456024.html
Copyright © 2011-2022 走看看