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 . 效果

相关推荐
葡萄城技术团队16 分钟前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei20 分钟前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟23 分钟前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
一晌小贪欢44 分钟前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
迪康Defender1 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
16月6日-晴2 小时前
Java面向对象——接口
java·开发语言
wuyk5552 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
geovindu2 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
Java小白笔记2 小时前
Java 实现 ZIP 压缩包生成方案
java·开发语言·网络·7-zip
Persistent的粽子!2 小时前
C++:类与对象(一)
开发语言·c++·经验分享·笔记