美文网首页
C#之Timer

C#之Timer

作者: 小羊爱学习 | 来源:发表于2024-07-30 13:29 被阅读0次

    一:System.Windows.Threading.DispatcherTimer(UI操作线程)

    这是一个基于WPF Dispatcher的计时器。它可以在指定的时间间隔内触发Tick事件,并在UI线程上执行回调函数,方便进行UI更新操作。

    private static System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();//创建定时器
    timer.Tick += new EventHandler(timer_out);//执行事件
    timer.Interval = new TimeSpan(0, 0, 0, 1);//1s执行
    timer.IsEnabled = true;//启用
    timer.Start();//开启
    
    public static void timer_out(object sender, EventArgs e)
    {
         timer.Tick -= new EventHandler(timer_out);//取消执行事件;   
         timer.IsEnabled = false;//禁用 
         timer.Stop();//停止
    }
    

    二:System.Timers.Timer

    这是一个基于线程的计时器。它可以在指定的时间间隔内触发Elapsed事件,并在后台线程上执行回调函数。如果需要进行UI更新,需要跨线程调用Dispatcher来更新UI。
    注意:System.Timers.Timer不能直接操作界面UI,因为它是基于线程的计时器,回调函数会在后台线程上执行,无法直接访问UI元素。如果需要在System.Timers.Timer中更新UI,可以使用Dispatcher来将更新操作切换到UI线程上执行。例如,在回调函数中使用Dispatcher.Invoke或Dispatcher.BeginInvoke方法来更新UI元素。

    System.Timers.Timer timer = new System.Timers.Timer(1000);//创建定时器,设置间隔时间为1000毫秒;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(theout);  //到达时间的时候执行事件;
    timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
    timer.Enabled = true;//需要调用 timer.Start()或者timer.Enabled = true来启动它,
    timer.Start();//timer.Start()的内部原理还是设置timer.Enabled = true;
    
    public void theout(object source, System.Timers.ElapsedEventArgs e)
    { 
          timer.Elapsed -= new System.Timers.ElapsedEventHandler(theout);  //取消执行事件;  
          timer.Enabled = false;//禁用 
          timer.Stop();//停止
    }
    

    三:System.Threading.Timer

    这是一个基于线程池(ThreadPool)的计时器。它可以在指定的时间间隔内触发回调函数,并在线程池线程上执行,需要手动调用Dispatcher来更新UI。

    System.Threading.Timer timer;
    timer = new System.Threading.Timer(new TimerCallback(timerCall), this, 3000, 0);//创建定时器
    
    private void timerCall(object obj) 
    {
          timer.Dispose();//释放定时器
    }
    

    四:System.Windows.Forms.Timer

    这是一个基于Windows Forms的计时器,不适合在WPF应用程序中使用。

    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();//创建定时器
    timer.Tick += new EventHandler(timer1_Tick);//事件处理
    timer.Enabled = true;//设置启用定时器
    timer.Interval = 1000;//执行时间
    timer.Start();//开启定时器
    
    private void timer1_Tick(object sender, EventArgs e)
    {
          timer.Stop();//停止定时器
          timer.Tick -= new EventHandler(timer1_Tick);//取消事件
          timer.Enabled = false;//设置禁用定时器
    }
    

    小结:

    • DispatcherTimer:简单易用,适合UI更新,但长时间的回调函数可能影响UI的响应性能。
    • Timers.Timer:适用于复杂逻辑或耗时操作,需要注意跨线程访问UI。
    • Threading.Timer:适用于高并发场景,需手动调用Dispatcher来更新UI。
    • Windows.Forms.Timer:不建议在WPF中使用。
    • DispatcherTimer是运行在UI线程上的,其好处是可以在定时事件中修改UI元素,其它三种定时器是运行在独立的线程上的,与UI线程无关。因为它是基于WPF线程模型的,也最常用的一种定时器,可以直接操作UI,并且易于使用和理解。如果需要更高效的计时器,可以考虑使用System.Timers.Timer,但是需要注意跨线程访问UI的问题。
    • 每种定时器都有其特点和适用场景,选择适合自己需求的定时器很重要。一般来说,对于简单的UI更新操作,可以使用DispatcherTimer;对于复杂逻辑或者耗时操作,可以选择System.Timers.Timer或System.Threading.Timer,但需要注意跨线程访问UI的问题。

    相关文章

      网友评论

          本文标题:C#之Timer

          本文链接:https://www.haomeiwen.com/subject/gqhghjtx.html