adr*_*fek 10 c# office-interop excel-interop
我有一个处理excel的应用程序.最近我遇到了Excel对象创建速度非常慢的问题.
我用这个简单的代码重新创建了这个问题:
Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
Run Code Online (Sandbox Code Playgroud)
第二行导致延迟.
为了测量新对象分配所需的时间,上面的代码已经扩展了时间跟踪解决方案,结果是确凿的.在NORMAL情况下,上面的代码在0.5秒内执行,而在FAULTY-BEHAVIOR的情况下,它可能需要长达5分钟.
没有内存泄漏,并且正确释放了excel对象.我的解决方案全年24/7运行,没有任何问题.我不确定它是否重要但是应用程序在20个单独的用户会话(服务器机器)上运行.因此,此应用程序有20个副本同时运行,可能会导致同时运行20个Excel副本.
这个问题第一次在2个月前被注意到,并且已通过升级办公室(2010年 - > 2013年)得到解决.这次我有更多时间进行调查,遗憾的是结果并不乐观.
事实:
主要问题:
外部内容
编辑 - 附加测试
PowerPoint构造函数不受延迟的影响
ppApp = new Microsoft.Office.Interop.PowerPoint.Application();
Run Code Online (Sandbox Code Playgroud)
我自己找到了解决方案.我会发布它,因为其他人可能遇到类似的问题,它可以节省他数小时/天的调查.
我做了什么来找到解决方案?
我已经使用Process Monitor分析了测试应用程序(基本上只有一行创建了新的excel应用程序)并且它没有显示任何重要的内容.然后我用新启动的Excel过程重复分析.它突出了许多Windows注册表的读取
HKEY_USERS\S-1-5-21-2929665075-1795331740-364918325-1024\Software\Microsoft\Office\15.0\Excel\Resiliency\DocumentRecovery
Run Code Online (Sandbox Code Playgroud)
在上面的位置我发现了成千上万的钥匙.它们都是由Excel的"自动恢复"功能创建的.由于数字,在启动新的Excel对象时加载它们需要大约40秒.此数字还乘以另外10-20个同时加载的会话(我是否提到我的应用程序在20个用户会话上运行?).
解决方案: 删除"Resilency"注册表树可以解决问题.
为什么所有这些"自动恢复"条目首先出现在那里?我想我不能很好地处理Excel的关闭,它"认为"我经常崩溃并"试图"帮助.
现在剩下的就是阻止它再次发生.我将仔细研究一下我的ExcelClose()函数.
感谢您的关注 - 阿德里安
归档时间: |
|
查看次数: |
2253 次 |
最近记录: |