1. 代码
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);
}
}
}
}
}
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 . 效果
