多线程操作界面控件内容, 会出现线程间操作无效,从不是创建控件“xxx”的线程访问它。这个异常来源于.NET2的一个限制:工作线程(包括timer控件)不能访问窗口线程创建的控件
需要InvokeRequired需要比较调用线程ID和创建线程ID,让主线程调用一个委托(delegate或者Action)来更新控件内容,而不是线程来更新
// 代理实现异步调用以设置TextBox控件text属性 //delegate void SetTextCallback(string text); private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.lblLeftTime.InvokeRequired) { Action ac = new Action(() => { lblLeftTime.Text =text; }); this.Invoke(ac); //SetTextCallback d = new SetTextCallback(SetText); //this.Invoke(d, new object[] { text }); //这里执行后。则InvokeRequired就为false。因为此时已经是主线程访问当前创建的控件 } else { this.lblLeftTime.Text = text; } } private void tmLeftTime_Tick(object sender, EventArgs e) { var text = ((timeGetTime() - workersStartTime[0])/1000f).ToString("#0.0"); SetText(text); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
2018-11-30 优惠券设计及流程
2018-11-30 美化微信公众号图文内容,修饰边框
2018-11-30 垂直行业公众号推广(二) 导入客户
2018-11-30 垂直行业公众号推广(一) 冷启动
2018-11-30 转:我收到一份《中国焦虑图鉴》
2012-11-30 分布式文件系统(一)GlusterFS
2010-11-30 CodePlex 开源项目关注