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

求助:C#项目第11次打印触发CLR崩溃,抛出System.ExecutionEngineException

针对C# WinForms第11次打印崩溃及ExecutionEngineException的排查方案

这种固定次数触发的崩溃,十有八九是资源泄漏或者对象未正确释放积累到阈值导致的,结合你给出的代码和异常信息,我整理了几个实用的排查和修复方向:

1. 强制释放Printing_Form实例资源

你当前的代码每次创建Printing_Form实例后没有做任何释放操作,WinForms窗体是实现了IDisposable接口的对象,多次创建不释放会导致非托管资源(比如窗口句柄、GDI资源)持续占用,到第11次就触发了系统的资源限制。

建议用using语句包裹窗体实例,确保打印完成后自动释放资源:

using (var Printinstance = new Printing_Form())
{
    Printinstance.PrintCard();
}

同时检查Printing_Form内部的打印相关对象(比如PrintDocument、PrintDialog),在窗体的FormClosed事件或者打印完成的回调里,手动调用它们的Dispose()方法,避免内部资源泄漏。

2. 排查ExecutionEngineException的根源

这个异常通常和非托管代码交互出错有关,WinForms打印底层依赖GDI+的非托管实现,资源无效或泄漏会触发这个错误。可以尝试以下操作验证:

  • 在打印完成后主动触发垃圾回收(仅用于验证,不建议作为常规解决方案):
    using (var Printinstance = new Printing_Form())
    {
        Printinstance.PrintCard();
    }
    GC.Collect();
    GC.WaitForPendingFinalizers();
    
  • 检查PrintCard()方法里有没有自定义的P/Invoke调用或者直接操作打印机驱动的代码,如果有,确保这些非托管资源被正确释放(比如调用Marshal.FreeHGlobal释放非托管内存,关闭句柄等)。

3. x86架构下的特殊检查

x86进程的内存和句柄限制比x64严格,更容易因为资源泄漏触发崩溃:

  • 打开任务管理器的「详细信息」页,观察你的进程在每次打印后的句柄数、私有内存变化,如果这些数值持续增长不回落,说明确实存在资源泄漏。
  • 用Visual Studio的诊断工具(Debug模式启动项目后打开),跟踪对象的生命周期,看看Printing_Form实例是否在打印完成后被正确回收。

4. 系统打印层面的排查

有时候崩溃也可能和系统打印队列或驱动有关:

  • 尝试在打印前清空系统的打印队列,避免前10次打印任务残留导致资源占用。
  • 检查打印机驱动是否为最新版本,旧驱动在x86环境下可能存在兼容性问题,更新驱动后再测试。

内容的提问来源于stack exchange,提问作者Kierstead_r

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:17:31