You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:06