C#中List<Intersection>的GraphicsPath绘制参数无效异常排查
问题原因及解决思路:已释放的GraphicsPath导致绘制异常
问题原因
- 你在
create_intersection_paths方法中,将创建好的thick_path和thin_path引用赋值给List<Intersection>内的实例属性后,立即调用了Dispose()释放这两个路径的GDI+非托管资源。 GraphicsPath实现了IDisposable接口,调用Dispose()后,其内部关联的系统绘图资源会被回收,对象本身虽未被GC回收,但已处于无效状态,无法再被Graphics.DrawPath等依赖其资源的方法使用。- 调试时路径有效是因为调试断点停在
Dispose()执行前,资源尚未被释放;后续执行draw_intersection_background时,资源已被回收,因此抛出ArgumentException。
解决思路
- 延迟资源释放时机:不要在路径还需要被使用时调用
Dispose(),应该在所有绘制操作完成后(比如窗体关闭、控件销毁时),统一遍历List<Intersection>,对其中的thick_path和thin_path执行Dispose()。 - 创建独立路径实例:若不需要共享路径资源,为每个
Intersection实例创建独立的GraphicsPath副本,而非直接赋值引用。示例代码:
这样每个实例拥有自己的资源,后续可按需单独释放,不会互相影响。// 为每个Intersection复制独立路径 var newThickPath = new GraphicsPath(thick_path.PathPoints, thick_path.PathTypes); intersection.thick_path = newThickPath; - 规范using语句的使用:如果是临时创建路径,确保
using块的作用域覆盖所有需要使用该路径的代码,避免提前释放资源。比如:using (var tempPath = new GraphicsPath()) { // 执行路径创建、赋值给Intersection实例等操作 // 确保所有依赖tempPath的操作都在using块内完成 }
内容的提问来源于stack exchange,提问作者Gus
相关产品推荐
相关产品推荐

