求助: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
相关产品推荐
相关产品推荐

