针对c# winform System.Timers.Timer定时器的介绍和注意

 一、System.Timers.Timer多线程定时器

        System.Timers.Timer作为服务器和多线程定时器,由于其可以在多个线程之间移动来处理触发 Elapsed 的事件,因此在引发事件时效性方面其比windows定时器更加准确。

        System.Timers.Timer没有用户界面,在运行时不可见。

        下面介绍一个使用例程:

using System;
using System.Timers;

public class Example
{
   private static System.Timers.Timer aTimer;
   
   public Example()
   {
      SetTimer();  // 初始化定时器
   }
   // 初始化定时器
   private static void SetTimer()
   {
        // 创建一个每2000ms运行一次的定时器
        aTimer = new System.Timers.Timer(2000);
        // 绑定回调函数
        aTimer.Elapsed += OnTimedEvent;
        // 设置自动复位,如若不设置,回调函数只会执行一次
        aTimer.AutoReset = true;
        // 使能定时器,相当于开关功能
        aTimer.Enabled = true;
    }
    // 定时器回调函数
    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        // 控制台打印
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}

二、System.Timers.Timer使用注意

        由于System.Timers.Timer为多线程定时器,因此当定时器被触发时,其不会顾及上一个回调函数有没有运行完成,而是直接开启一个线程运行回调函数。

        但是这样必须注意一种情况:如果上一个回调函数还没有运行完,System.Timers.Timer又再次触发,那么会有多个回调函数同时运行,这样的结果可能导致内部程序运行紊乱

        解决方法也很简单,只需要给回调函数加个锁使的同时刻只有一个函数运行即可,详情参阅这位博主的博客(C# 定时执行方法: System.Timers.Timer及Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题_c# system.timers.timer 会卡主ui-CSDN博客),写的很清晰具体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值