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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:19:52