WinForm调用1000元素presentation触发index out of range exception求助
Windows窗体presentation全局变量运行报错修复方案
我在Windows应用程序窗体作用域中定义了一个含1000个元素的presentation,在程序多个功能区域都有调用,目前运行时报错。
以下是该场景下最常见的报错原因和对应修复方法:
- 跨线程访问冲突:如果非UI线程直接修改presentation或者操作和presentation绑定的UI控件,会触发Windows窗体的线程安全校验报错。
修复方法:所有关联操作先判断控件线程上下文,用Invoke委托到UI线程执行,示例代码:if (this.InvokeRequired) { this.Invoke(new Action(() => { // 此处放置修改presentation或者操作关联UI的代码 })); } else { // 直接执行操作代码 } - 并发读写索引越界/空引用:多个功能模块同时读写presentation时没有加锁,会导致集合计数不同步,访问到不存在的索引或者未完成赋值的元素。
修复方法:定义全局锁对象统一管控读写操作:
首先定义锁:private readonly object _presLock = new object();
所有读写presentation的代码都包裹在锁结构内:lock(_presLock) { // 此处放置对presentation的增删改查代码 } - 变量未初始化调用:如果presentation仅在某个窗体事件(比如Load、Click)中初始化,其他模块在对应事件触发前就调用该变量,会报空引用错误。
修复方法:将presentation的初始化逻辑放到窗体构造函数的InitializeComponent();之后执行,保证窗体初始化完成后变量就已完成赋值。 - GDI资源溢出:如果presentation的每个元素都持有Bitmap、Brush、Font等GDI资源,1000个元素累计超过系统分配给进程的GDI句柄限额也会触发运行时错误。
修复方法:不需要使用的元素及时调用Dispose()方法释放持有的非托管资源,不要冗余持有无用对象。
内容的提问来源于stack exchange,提问作者Matin
相关产品推荐
相关产品推荐

