C#中三种定时器Timer的使用方法

在.NET Framework里面提供了三种Timer:

① System.Windows.Forms.Timer
(运行在主线程上,通过Tick事件触发)

② System.Timers.Timer
(可以多线程,也可以单线程,通过Elapsed事件触发)

③ System.Threading.Timer

  1. System.Windows.Forms.Timer:基于窗体程序,直接拖拽到窗体上。
    属性:
    Interval:间隔触发的时间。
    Enabled:true表示启用,false表示禁止
  private void WriteInfo(string str)
  {
       if (txt_Info.InvokeRequired)
       {
           this.Invoke(new Action(() => { txt_Info.AppendText(str + "\r\n"); }));
       }
       else
       {
           txt_Info.AppendText(str + "\r\n");
       }
  }

  private void btn_Start_Click(object sender, EventArgs e)
  {
       if (btn_Start.Text == "开始")
       {
            btn_Start.Text = "停止";
            Application.DoEvents();
            timer1.Enabled = true;
            btn_Start.Text = "开始";
       }
   }

   private void timer1_Tick(object sender, EventArgs e)
   {
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            WriteInfo("Count: " + i + "\t  id:" + Thread.CurrentThread.ManagedThreadId);
        }
   }

结果:
在这里插入图片描述
总结:

  1. 从上面的运行结果可以看到,窗体Timer 都是运行在同一个线程上主线程),所以会卡UI 。
  2. 单线程执行的优点就是,不需要关心线程安全,也就是说,一段程序从头至尾都是由一个线程完成。
  3. Form下的Timer用于对时间精度要求不高的地方。

2. System.Timers.Timer:只能通过声明对象的方式使用,用于对时间精度有要求的地方。
属性:
AutoReset:true表示事件关联的方法只执行一次,false表示一直执行。
SynchronizingObject:此timer默认是运行在线程池的,也就是说CPU自动分配线程,但是我们可以使用SynchronizingObject属性指定唯一线程。

		private System.Timers.Timer tmr = new System.Timers.Timer();
        private object obj = new object();

        public Timer_timer()
        {
            InitializeComponent();
         
            tmr.Elapsed += new System.Timers.ElapsedEventHandler(OnTmrTrg);
            tmr.Interval = 100;
            tmr.AutoReset = true; //true-一直循环 ,false-循环一次   
            // tmr.SynchronizingObject = this; //运行在主线程上
            tmr.Enabled = false;
        }
        private void OnTmrTrg(object sender, System.Timers.ElapsedEventArgs e)
        {
            WriteInfo("tmr loop:  " + Thread.CurrentThread.ManagedThreadId);
            lock (obj)
            {
                WriteInfo("tmr is running :" + Thread.CurrentThread.ManagedThreadId);
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(1000);
                    WriteInfo("Count: " + i + ": " + Thread.CurrentThread.ManagedThreadId);
                }
            }
        }
        private void WriteInfo(string str)
        {
            if (txt_Info.InvokeRequired)
            {
                this.Invoke(new Action(() => { txt_Info.AppendText(str + "\r\n"); }));
            }
            else
            {
                txt_Info.AppendText(str + "\r\n");
            }
        }
        private void btn_Enter_Click(object sender, EventArgs e)
        {
            if (btn_Enter.Text == "确定")
            {
                btn_Enter.Text = "取消";
                Application.DoEvents();
         
                tmr.Start();
            }
            else
            {
                btn_Enter.Text = "确定";
                tmr.Stop();
            }
        }

结果:在未指定SynchronizingObject属性的时候默认是多线程运行的,运行如图:
多线程执行
通过 SynchronizingObject = this 将指定主线程,运行结果如下
单线程执行
总结:

  1. Timer.timer是通过主线程创建,执行在线程池上的,所以默认在不指定SynchronizingObject属性的情况下,不卡主界面。
  2. 由于可以多线程执行,所以需要考虑线程安全(假设一种情况,A线程正在计算余额(总金额-消费金额),这个时候然后B线程将总金额改了,那A线程所返回的会发生错误)。解决方案有两种:1. 金额的计算工作全部由A线程执行(单线程)。2. 使用Lock () 确保每次A线程执行计算任务的时候B线程等待A完成在进行。
  3. Timer.timer可以通过AutoReset = false 设置,只执行一次事件方法。
  4. Start ()&Stop () 和 Enabled = true/false等效。

System.Threading.Timer:同样是运行在线程池,但是此timer是以回调的方式来实现定时任务,

    public partial class Threading_Timer : Form
    {
        public System.Threading.Timer tmr;
        public static int count = 0;

        public Threading_Timer()
        {
            InitializeComponent();
           
        }

        private void btn_Start_Click(object sender, EventArgs e)
        {
            if (btn_Start.Text == "开始")
            {
                btn_Start.Text = "结束";
                tmr = new System.Threading.Timer(new System.Threading.TimerCallback((obj) =>
                {
                    Tmp tmp = (Tmp)obj;
                    WriteInfo(tmp.info + ":" + count++);

                }), new Tmp() { info = "Count: " }, 0, 1000);
            }
            else
            {
                btn_Start.Text = "开始";
                tmr.Dispose();
            }
        }
        private void WriteInfo(string str)
        {
            if (txt_Info.InvokeRequired)
            {
                this.Invoke(new Action(() => { txt_Info.AppendText(str + "\r\n"); }));
            }
            else
            {
                txt_Info.AppendText(str + "\r\n");
            }
        }
    }
    public class Tmp
    {
        public string info { get; set; }
    }

运行结果:
Threading.Timer
总结:

  1. 运行于线程池,不卡主界面。
  2. 没有Start () 和 Stop () 方法控制启动停止。在对象构造的时候启动,需要使用Dispose () 方法停止执行。
  3. 构造函数参数列表: new timer ( new TimerCallback ( callBack), 回调函数传参对象 , 启动时间 , 间隔时间)。
  • 28
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: timer定时器是一种计时工具,常用于需要定时执行某些任务的场景。它能够在设定的时间到达后触发某个事件或执行某段代码。 timer定时器使用非常灵活,可以根据需求设置不同的时间间隔和执行次数。常见的定时器有单次定时器和循环定时器两种。 单次定时器可以在指定的时间间隔后执行一次任务,并且只执行一次。例如,我们可以设置一个单次定时器,在5秒后触发某个函数执行。 循环定时器可以按照设定的时间间隔不断重复执行任务。例如,我们可以设置一个循环定时器,每隔1分钟触发某个函数执行。 timer定时器不仅可以用于编程语言,也可以用在各种电子设备。比如,我们可以在手机上设置一个定时器,用来提醒我们在某个时间点做某件事情,或者在烹饪过程使用定时器来控制食物的烹饪时间。 总之,timer定时器是一种非常实用的工具,可以在需要定时执行任务的场景发挥重要作用。无论是在编程还是在日常生活,我们都可以利用timer定时器来提高效率和方便操作。 ### 回答2: timer定时器是一种用于控制时间间隔的设备或工具。它可以在给定的时间间隔内执行特定的任务或操作。 timer定时器通常用于各种计时和定时操作,例如在游戏实现角色的移动、动画效果的切换,或者定时播放音乐等。 在编程,我们可以使用timer定时器来实现事件的定时触发。通过设置一个特定的时间间隔和一个回调函数,当时间到达设定的时间间隔时,定时器将会触发回调函数,并执行其的代码。 timer定时器可以在编程语言以不同形式实现,例如在C语言,我们可以使用标准库的函数来创建和使用定时器。在C语言,我们通常需要定义一个回调函数,用于实现定时触发时需要执行的操作,然后使用定时器函数来设置时间间隔和回调函数。 定时器使用可以帮助我们在程序实现各种时间相关的任务,提高程序的可靠性和运行效率。但是需要注意的是,在使用定时器时需要合理设置时间间隔,避免频繁触发定时器导致系统负荷过大和性能下降。 总结起来,timer定时器是一种用于控制时间间隔的设备或工具,它在编程可以用来实现各种时间相关的操作。通过设置时间间隔和回调函数,我们可以实现定时触发并执行相应的代码。 ### 回答3: timer定时器是一种用来测量或控制时间间隔的设备或工具。它通常用于在特定时间间隔内执行一些操作或发出信号。 timer定时器有广泛的应用领域。在家庭生活,我们可以使用定时器来设置闹钟,提醒我们起床、上班、做饭等。在厨房,我们可以设置烤箱定时器来保证食物在正确定时烹饪,防止过度或不足。 在工业领域,timer定时器被广泛应用于自动化系统。它可以用来控制设备的运行时间,例如定时关闭空调或照明设备,节约能源。定时器还可以用于控制机器的运转周期,在特定时间间隔内启动或停止机器,提高生产效率。 在计算机编程timer定时器也是一个重要的概念。它可以用来控制代码的执行时间,例如设置一个定时器在特定时间间隔内反复执行某个函数或代码块。这在游戏开发很常见,用来实现动画效果或定期更新游戏状态。 总之,timer定时器在我们的生活和工作扮演着重要的角色。无论是作为一个简单的时间管理工具还是一个复杂的控制设备,它都能够帮助我们提高效率、节约时间,并实现各种不同的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值