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

WinForm指定时间启动倒计时显示到Label的跨线程问题解决

错误原因

你使用的System.Timers.Timer的Elapsed事件默认由线程池线程触发,而Windows窗体控件仅允许被创建它的UI线程访问。你在Elapsed事件回调中直接调用tik_tak(),并在方法内直接操作label1控件,就会触发跨线程访问异常。

解决方案

方案1:给Timer指定同步对象(改法最简单)

在初始化每分钟触发的Timer时,将它的SynchronizingObject属性设置为当前窗体实例,这样Elapsed事件就会直接在UI线程执行,不需要额外修改其他逻辑:

// 你的每分钟触发的Timer初始化逻辑里新增这行即可
yourTimer.SynchronizingObject = this; // this为当前窗体实例

方案2:操作控件前通过Invoke封送到UI线程(通用跨线程控件访问方案)

直接修改t_Tick方法,判断当前线程是否为UI线程,如果不是就通过Invoke将操作UI的逻辑封送到UI线程执行:

void t_Tick(object sender, EventArgs e)
{
    TimeSpan ts = EndOfTime.Subtract(DateTime.Now);
    if (label1.InvokeRequired)
    {
        label1.Invoke(new Action(() => label1.Text = ts.ToString()));
        return;
    }
    label1.Text = ts.ToString();
}

内容的提问来源于stack exchange,提问作者bags

相关产品推荐
方舟 Agent Plan

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

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