C# 定时器类实现1s定时器更新UI

1. 代码

//BaseTimer.cs

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace baseTimer
{
    //定义一个timer超时的委托
    public delegate void baseTimerDelegate(int cnt);

    
    class BaseTimer : IDisposable
    {
        private bool disposed = false;        
        private System.Threading.Timer timer1;
        private int period = 0;
        private int cnt = 0;
        private readonly object lockObject = new object();
        private bool isTimerRunning = false;
        private baseTimerDelegate timeoutDelegate;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    timer1?.Dispose();
                    timer1 = null;
                }
                disposed = true;
            }
        }

        public BaseTimer(baseTimerDelegate Delegate1,int period1)
        {
            period = period1;
            timeoutDelegate = Delegate1;
            timer1 = new System.Threading.Timer(TimerStepCallBack, null, Timeout.Infinite, period);
        }
        private void TimerStepCallBack(Object stateInfo)
        {
            cnt++;
            timeoutDelegate(cnt);
        }

        /// <summary>
        /// 启动定时器,每秒中断一次
        /// </summary>
        public void Start(int ms)
        {
            lock (lockObject)
            {
                if (!isTimerRunning)
                {
                    isTimerRunning = true;
                    cnt = 0;
                    // 立即启动,每秒触发一次
                    period = ms;
                    timer1.Change(0, ms);
                }
            }
        }

        /// <summary>
        /// 停止定时器
        /// </summary>
        public void Stop()
        {
            lock (lockObject)
            {
                if (isTimerRunning)
                {
                    timer1.Change(Timeout.Infinite, period);
                    isTimerRunning = false;
                    cnt = 0;
                    timeoutDelegate(cnt);
                }
            }
        }
    }
}

//Form1.cs

csharp 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace baseTimer
{
    public partial class Form1 : Form
    {
        //定义一个timer超时的委托
        private baseTimerDelegate baseTimerDelegate1;
        private BaseTimer baseTimer1;

        public Form1()
        {
            InitializeComponent();

            baseTimerDelegate1 = new baseTimerDelegate(TimerBaseInvoke);
            baseTimer1 = new BaseTimer(baseTimerDelegate1,1000);
            // 订阅窗体关闭事件
            this.FormClosing += Form1_FormClosing;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            baseTimer1?.Dispose();
        }

        private void TimerBaseInvoke(int cnt)
        {
            Invoke((EventHandler)(delegate
            {
                textBox1.Text = cnt.ToString();
            }));
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            baseTimer1.Start(1000);
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            baseTimer1.Stop();
        }
    }
}

2 . 效果

相关推荐
爱敲代码的小鱼40 分钟前
事务核心概念与隔离级别解析
java·开发语言·数据库
小冷coding1 小时前
【Java】遇到微服务接口报错导致系统部分挂掉时,需要快速响应并恢复,应该怎么做呢?如果支付服务出现异常如何快速处理呢?
java·开发语言·微服务
星火开发设计1 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月1 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++
HeisenbergWDG1 小时前
线程实现runnable和callable接口
java·开发语言
少控科技1 小时前
QT新手日记028 QT-QML所有类型
开发语言·qt
HarmonLTS2 小时前
Python人工智能深度开发:技术体系、核心实践与工程化落地
开发语言·人工智能·python·算法
丁一郎学编程2 小时前
测试开发面经
java·开发语言
wjs20242 小时前
TypeScript 命名空间
开发语言
a程序小傲2 小时前
京东Java面试被问:RPC调用的熔断降级和自适应限流
java·开发语言·算法·面试·职场和发展·rpc·边缘计算