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
相关产品推荐
相关产品推荐

