如何在C# WinForms项目中设置每60秒自动执行指定代码的定时器?
WinForms 60秒自动执行业务流程实现方案
原理说明
WinForms 场景优先用 System.Windows.Forms.Timer 即可,该定时器运行在UI线程,基于Windows消息循环触发事件,和你原有按钮点击的线程上下文完全一致,不会出现跨线程访问控件的异常,刚好适配从VB6迁移的项目,不需要额外做线程兼容处理。
定时器达到你设置的时间间隔后,会往UI线程的消息队列推送Tick事件消息,UI线程空闲时就会执行你绑定到Tick事件的逻辑。
具体实现步骤
步骤1:抽离公共业务逻辑
把你原有GetQue按钮点击事件里的核心代码抽成独立方法,避免按钮点击和定时器触发写两份重复逻辑:
private void ProcessDocumentAndSendMail() { // 此处直接复制你原有GetQue按钮点击事件里的全部代码:采集文档key、发送邮件的逻辑都放这里 }
原有按钮的点击事件直接调用该方法即可,不需要修改原有业务逻辑:
private void btnGetQue_Click(object sender, EventArgs e) { ProcessDocumentAndSendMail(); }
步骤2:初始化并启动定时器
在窗体级别声明定时器变量,在窗体加载事件里完成配置和启动:
// 窗体级定时器变量 private System.Windows.Forms.Timer autoProcessTimer; private void Form1_Load(object sender, EventArgs e) { autoProcessTimer = new System.Windows.Forms.Timer(); // 间隔单位为毫秒,60秒对应60000毫秒 autoProcessTimer.Interval = 60000; // 绑定定时器触发时执行的事件 autoProcessTimer.Tick += AutoProcessTimer_Tick; // 启动定时器 autoProcessTimer.Start(); } // 定时器触发事件 private void AutoProcessTimer_Tick(object sender, EventArgs e) { ProcessDocumentAndSendMail(); }
可选优化
如果你的业务逻辑执行时间可能超过60秒(比如发邮件时网络卡顿长时间无响应),可以在执行业务前先暂停定时器,执行完成后再重启,避免逻辑重复触发:
private void ProcessDocumentAndSendMail() { autoProcessTimer.Stop(); try { // 原有业务逻辑 } finally { // 确保就算逻辑抛异常也能重启定时器 autoProcessTimer.Start(); } }
内容的提问来源于stack exchange,提问作者Måns Bodin
相关产品推荐
相关产品推荐

