如何调试缓慢的 Office 应用程序互操作构造函数?

2023-11-22

我有一个处理 Excel 的应用程序。最近我遇到了创建 Excel 对象非常慢的问题。

我用这个简单的代码重新创建了这个问题:

Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application(); 

第二行导致延迟。

为了测量新对象分配所需的时间,上面的代码已使用时间跟踪解决方案进行了扩展,并且结果是结论性的。在正常情况下,上述代码在 0.5 秒内执行,而在故障行为的情况下,可能需要长达 5 分钟的时间。

没有内存泄漏,Excel 对象被正确释放。我的解决方案全年 24/7 运行,没有出现任何问题。我不确定这是否重要,但应用程序正在 20 个单独的用户会话(服务器计算机)上运行。因此,该应用程序有 20 个副本同时运行,可能会导致 20 个 Excel 副本同时运行。

该问题首次在 2 个月前被发现,并已通过升级 Office(2010 -> 2013)解决。这次我有更多时间进行调查,但遗憾的是结果并不乐观。

Facts:

  • 目前只有一台机器受此问题影响(24 个 cpu 核心,24GB RAM)
  • 当“延迟”发生时,CPU完全没有压力
  • 我尝试使用“进程监视器”应用程序来验证当我们“new Excel.Application()”构造函数时会发生什么(查看是否有任何过多的磁盘/内存/CPU 使用率)-没有资源限制的迹象。没有与 COM 对象等相关的日志文件的迹象。
  • 这里唯一的问题是这几分钟的延迟。所有其他 Excel Interop 命令照常工作。

主要问题:

  • 有没有办法调试此 Microsoft.Office.Interop.Excel.Application() 构造函数以查看哪一部分存在问题?

外部内容

  • 一个有类似问题的人。他的解决方案对我的问题根本没有帮助。

编辑-附加测试

PowerPoint 构造函数不受延迟影响

ppApp = new Microsoft.Office.Interop.PowerPoint.Application();

我自己找到了解决方案。我会将其发布,因为其他人可能会遇到类似的问题,这可以节省他数小时/数天的调查时间。

我做了什么来找到解决方案?

我分析了测试应用程序(基本上只有一行正在创建新的 Excel 应用程序)过程监控器它没有显示出任何重要的东西。然后我用新启动的Excel流程重复分析。它突出显示了对 Windows 注册表的大量读取

HKEY_USERS\S-1-5-21-2929665075-1795331740-364918325-1024\Software\Microsoft\Office\15.0\Excel\Resiliency\DocumentRecovery

在上面的位置下我发现了数以万计的钥匙。它们都是由 Excel 的“自动恢复”功能创建的。由于数量原因,启动新 Excel 对象时加载它们大约需要 40 秒。这个数字还乘以另外 10-20 个同时加载的会话(我是否提到过我的应用程序正在 20 个用户会话上运行?)。

解决方案:删除“弹性”注册表树就可以解决问题。

为什么所有这些“自动恢复”条目首先存在?我想我不能很好地处理 Excel 的关闭,它“认为”我经常崩溃并“尝试”提供帮助。


现在剩下的就是防止这种情况再次发生。我将仔细查看我的 ExcelClose() 函数。

感谢您的关注 - 阿德里安

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调试缓慢的 Office 应用程序互操作构造函数? 的相关文章

  • 如何安装 C++ 的 VOCE?

    我正在尝试安装 VOCE api 它是为 C 和 Java 构建的语音识别 API 这是我第二次使用外部 C 库 也是第一次使用 Java C api 语音链接 http voce sourceforge net http voce sou
  • 如何从 Visual Studio 2012 导出 C# 应用程序以在其他计算机上运行?

    我刚刚在 Visual Studio 2012 中制作了我的第一个 C 应用程序 我想以某种方式导出它 以便其他人可以在他们的计算机 包括没有 Visual Studio 2012 的计算机 中使用它 我该怎么做 我是 C 新手 找不到任何
  • C中的字符串读取

    我对 C 中的字符串读取没有任何疑问 字符串读取函数 如 gets scanf read fscanf fgets 哪个 C 函数可以从任何文件中安全地读取字符串 Or 哪个 C 函数可以可靠地读取文件中的字符串 如果输入函数将缓冲区的长度
  • Outlook VSTO 添加上下文菜单项

    我正在尝试将菜单项添加到附件上下文菜单 问题是该项目没有显示 我看过一些例子 他们说这段代码应该可以工作 this Application AttachmentContextMenuDisplay new ApplicationEvents
  • 抽象类、构造函数和 Co

    嗯 我正在尝试重用 C 代码的一部分 它是一个带有UDP服务器的抽象类 可以在这里看到 http clutch inc com blog p 4 http clutch inc com blog p 4 我创建了一个像这样的派生类 publ
  • 从 C# 2.0 中的 dll 获取命名空间、类名

    我将动态获取dll 我需要加载 dll 并获取命名空间 类名来调用方法 方法名称是静态的 它将始终为 OnStart 基本上我需要通过加载 dll 来运行一个方法 有人可以帮忙吗 要加载程序集 您可以这样做 Assembly assembl
  • 从 Xcode 5.1 项目中删除所有调试表达式

    我在使用 C 和 XCode 5 1 时意外添加了一个调试表达式 现在每次我尝试查看添加此表达式的函数堆栈时 XCode 都会崩溃 我不知道如何在不单击该功能的情况下摆脱这个表达式 所以我有点迷失了 我找到了对 Expressions so
  • Boost C++ 序列化 char *

    我有一个类 我正在尝试序列化一个shared ptr 但序列化对象的正常方法不起作用 class Object public Object Object shared ptr
  • 使用 C# 解码 Git 索引文件

    有没有关于Git索引文件内部结构的文档 从各种书籍中我知道它是二进制的并且包含暂存文件的 SHA 我知道 Git plumbing 命令有助于揭示索引内容 但是 例如 我自己使用 C 读取索引怎么样 我知道这个功能有几种实现方式 所以可以研
  • 使用 EPplus 在 Excel 中添加下拉菜单

    我需要帮助 如何使用 Epplus 在 Excel 中添加下拉列表 无需验证 我只需要把它添加到我的模板中 下拉列表中的记录不是动态的 using ExcelPackage p new ExcelPackage ExcelWorksheet
  • 是否可以解密由 openssl enc -k 加密的 C# / dotNet 6 中的 AES 密码保护文件?

    我需要解密来自 Linux 机器的文件 该文件受 Openssl 和 AES 密码保护 加密是通过以下方式完成的 openssl enc aes 256 cbc k
  • 禁用 Eclipse 的错误发现。 (Codan 误报)

    到目前为止我的经验是 Eclipse 的错误发现是可怕的错误 没有任何解决方案 尝试过 GXX EXPERIMENTAL CXX0X std c 0x std c 11在设置的每个点附近 我现在不想再寻找解决方案了 现在我只想看到真正的编译
  • Automapper、Mapper 未初始化。使用正确的配置调用初始化

    当我尝试将数据提交到数据库时 出现以下错误 Success false Error true ErrorType 2 Message System InvalidOperationException Mapper 未初始化 使用适当的配置调
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 如何将 dll 中包含的组件嵌入到 exe 中,以便它可以从内存运行?

    我正在尝试制作一个必须从内存运行的程序 通过Assembly Load bin 如上所述here http www codeproject com Articles 13897 Load an EXE File and Run It fro
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像

随机推荐

  • Nixpkgs 存储库中定义的“callPackage”在哪里(或者一般如何查找 Nix lambda 定义)?

    找到了很多描述的来源callPackage以及它的一些内部结构 但没有一个涉及它的位置 这就像 Nix 保守得最好的秘密 甚至手册似乎都在积极回避这个话题 我可以在给定的时间内找到它 但它是一个巨大的回购 资源 Nix callPackag
  • 我可以添加/减去绑定到元素属性的值吗?

    XAML 是否允许修改绑定值 Like Width Binding Elementname lstMine Path Width 100 这样我才能有一个相对的价值 您可以使用转换器来实现此目的 我的WPF 转换器图书馆包括一个Expres
  • 找不到结束分隔符“/”错误

    我调整了一个小脚本来检查反向链接 但我仍然收到错误 警告 preg match function preg match 第 17 行未找到结束分隔符
  • Java中的双倍增量[重复]

    这个问题在这里已经有答案了 可能的重复 如何在Java中以0 1f增量在0 1f和1 0f之间迭代 我的程序的一部分需要在 while 循环内使用值 如下所示 0 1 0 2 0 3 0 9 所以我需要在该循环内提供它们 这是代码 doub
  • NetworkCredential UseDefaultCredentials 不起作用

    我们很久以前就编写了一段代码来使用域凭据调用服务 现在域已更改并计划使用默认 Windows 帐户 所以我试图通过配置重置 asmx web 服务的网络凭据 我创建了一个 SoapExtentsion 类并尝试覆盖那里 即使它执行该行 但它
  • 如何将数据从 Express 服务器传递到反应视图?

    我有一个简单的 Express 服务器 连接到 orientdb 数据库 我需要将信息从 Express 传递到 React 视图 例如 在快递中我有 router get function req res next Vertex getF
  • 创建新Socket时添加超时

    我有一个带有 DHCP 的本地网络和几台 PC 其中之一应该是我的服务器 并自动连接到所有其他服务器 客户端 我的想法是这样的 首先 我在每个客户端 CServer 上创建一个服务器 用于侦听来自服务器 SClient 的客户端程序 当SC
  • java.net.SocketException:软件导致连接中止:recv 失败

    我无法找到以下错误的确切含义的适当答案 java net SocketException Software caused connection abort recv failed Notes 这种错误很少发生且不可预测 尽管出现此错误意味着
  • 在 Angularfire2 中“加入”Firebase 查询

    Update 我遇到的空值字段问题与数据库中不存在的键有关 因此这里的大部分讨论不适用于您的问题 如果您正在寻找一种在 AngularFire2 中 加入 查询的方法 下面接受的答案可以很好地做到这一点 我目前正在使用combineLate
  • 如何从AWS lambda java中的类路径加载属性文件

    我编写了 AWS lambda 函数 因为我想从属性文件和类路径中读取数据库连接详细信息 但我无法加载该文件 这是我的代码 InputStream input DBConfiguartion class getResourceAsStrea
  • 返回无效(0);与返回;中断功能[重复]

    这个问题在这里已经有答案了 我遇到了一些中断函数的代码return void 0 我相信这将被用来返回undefined但这可以简单地通过写来完成return Does return void 0 有一个额外的目的 或者这只是中断函数的两种
  • 使用 Azure Functions 3.0 中的属性将 Enum 序列化为字符串

    我尝试在 Azure Functions 3 0 3 1 应用程序中获取 HTTP 触发器来返回枚举的字符串表示形式 但没有任何运气 我已经尝试过 Core 3 0 和 Core 3 1 给定这个类 public enum TestEnum
  • SharedPreferences 何时被删除?

    SharedPreferences 类允许以简单类型 布尔值 字符串等 格式保存应用程序数据 通常它们不会被删除 并且应该持续存在 但是在更新 删除应用程序或清除应用程序缓存等情况下它们是否会被删除 当你这样做时clear data从设备应
  • 使用 SqlBulkCopy 时如何检索服务器生成的标识值

    我知道我可以通过不指定身份列来批量插入到我的表中SqlBulkCopyOptions KeepIdentity如上所述here 我希望能够做的是获取服务器生成的标识值并将它们放入我的数据表 甚至列表中 我看见this发布 但我希望我的代码是
  • SQL Server 加入顺序

    我在输入中有 2 个字符串 例如 1 5 6 和 2 89 9 具有相同数量的元素 3 或以上 我想要的那两个字符串作为 纵坐标连接 1 2 5 89 6 9 我想分配一个行号并在 2 个结果集之间进行连接 SELECT a item b
  • 在 Java 中如何确定区域设置使用 12 小时还是 24 小时时间?

    在Java中 我只想打印一天中的时间 以小时和分钟为单位 并希望它根据区域设置在 13 00 和 1 00 PM 之间正确切换 我该怎么做呢 区域设置未明确指定首选 12 小时时间格式还是 24 小时时间格式 相反 区域设置特定的日期格式由
  • 将整数转换为 MIPS 中的双精度数

    我想将其中的两个值相除 tn寄存器 我必须将这两个值相除才能得到双倍结果 但是该函数div只返回该除法的整数部分有人可以帮忙吗 我需要转换吗 t1 and t2 to f0 and f2 我怎么做 li t1 2 li t2 5 div f
  • hbm.xml 中映射的属性可以是暂时的吗?

    假设我有一个User像这样的实体 class User private String login transient private String hashedPassword 我永远不想转移hashedPassword给客户 所以我把它变
  • 控制 Android 上的用户语言

    我有一个多语言应用程序 我想让用户能够控制使用哪种语言 这意味着即使他有英语区域设置 如果他愿意 他也可以使用不同的语言 如何更改区域设置语言 每个应用程序 Android 不提供更改应用程序区域设置的方法 它是在全系统一级完成的 我认为这
  • 如何调试缓慢的 Office 应用程序互操作构造函数?

    我有一个处理 Excel 的应用程序 最近我遇到了创建 Excel 对象非常慢的问题 我用这个简单的代码重新创建了这个问题 Microsoft Office Interop Excel Application xlApp xlApp new