首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel互操作自动化定期冻结40-60秒。

Excel互操作自动化定期冻结40-60秒。
EN

Stack Overflow用户
提问于 2022-10-07 07:57:35
回答 1查看 69关注 0票数 0

我的程序使用C#和interop创建复杂的Excel文档。生成过程在Excel的一个不可见的后台实例上运行。一个特定的互操作调用有时运行得非常慢。大多数单独的互操作命令只需几毫秒,但分配给Font.Bold属性有时需要40-60秒。

这一行代码的“缓慢”运行是间歇性的,但遵循一种模式。在慢跑之后,所有连续的跑都会快7到10分钟,然后下一个呼叫就会慢了。这就像有一个‘定时器’,这是重置每次慢跑。当计时器在倒计时时,所有的互操作运行都很顺利。一旦计时器过期,Font.Bold的下一个分配将是缓慢的。无论调用是在计时器过期后立即发出,还是让计算机闲置几个小时并再次运行代码,都会很慢。

重新启动我的程序对这个不可见的计时器没有影响。换句话说,我可以运行我的代码,等待缓慢运行,然后退出进程。然后,如果我立即再次启动我的代码,我将得到快速运行在接下来的7-10分钟。我确保没有运行Excel或其他Office应用程序的实例,包括隐藏在后台的应用程序。唯一能“重置”计时器的是重新启动我的机器。就像计时器存在于Excel或我的代码之外的系统级别上一样。

这适用于调试和发行解决方案配置,运行时附带或不附加调试器。

还有一个关键的证据。如果我从“开始”菜单中手动打开Excel实例(即使用鼠标和键盘而不是互操作来驱动Excel实例),就会出现类似问题的重复步骤。

  1. 创建空白工作簿
  2. Home带中单击Cell Styles
  3. 右键单击样式并单击Modify...
  4. 单击Format...按钮
  5. Excel完全冻结40-60秒,最后对话框打开并正常运行。

最后一步中的冻结遵循相同的7-10分钟冷却行为,就像我在interop中分配给Font.Bold属性时一样。后台不可见的“计时器”显然是Excel对话框和互操作代码之间的共享。换句话说,在互操作中缓慢运行之后,将使用7-10分钟的Excel,而不是冻结。在Excel中冻结的对话框后面是7-10分钟的快速互操作.

我把这个问题表述为一个关于互操作的问题,因为这就是我第一次遇到这个问题的原因。实际上,它可能只是一个通用的Excel问题或bug,但只是在调试我的代码、尝试绝望的垃圾收集/Marshal.ReleaseComObject无稽之谈等许多天之后,我才发现了Excel的症状。

是什么导致了这种缓慢,我能做些什么呢?

Windows版本: Windows 10家庭21H1 (19043.2006)

Excel版本:版本2209构建16.0.15629.20152 64位

EN

回答 1

Stack Overflow用户

发布于 2022-10-07 07:57:35

我对我自己的问题有一个部分的答案,或者至少是一个解释。

我的推论是,Excel挂起时试图联系脱机打印机。通过将Windows默认打印机设置为可用的打印机来解决此问题。

关键是找到一个帖子 (归档12),其中有人描述了Excel冻结对话框的症状,并建议更改系统默认打印机。我的Windows默认打印机被设置为一个网络连接的HP LaserJet,Printers & scanners说它是Online,尽管它已经几个月没有连接到网络或接通电源了。将默认打印机更改为Microsoft Print to PDF,既消除了互操作中的挂起,也消除了Excel的实际使用。

这是猜测,但我想,当冻结发生时,Excel正在尝试与打印机联系,也许是为了确定它支持哪个设备字体。Excel GUI线程(!)最终在超时的网络呼叫中被阻塞。40-60秒大概是试图到达打印机时的网络超时,而7-10分钟的“计时器”是一个实际的操作系统范围内的计时器,它说‘如果连接到网络打印机失败了,假设它是不可到达的,并且不要在这个间隔内试图再次联系它’。

我在另一台机器上尝试过使用不同的脱机默认打印机,但无法复制。大概问题只存在于特定的打印机驱动程序中。

当代码在其他系统上运行时,我不知道能做些什么来防止这个问题。希望有问题的配置是罕见的。我觉得这同样可以归咎于Excel、打印机驱动程序或Windows操作系统,因此错误修复似乎不太可能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73984079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档