【发布时间】:2019-11-05 19:52:43
【问题描述】:
突然来电:
((Microsoft.Office.Interop.Word._Application)word).Quit(SaveChanges: Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges, OriginalFormat: Type.Missing);
需要永远(30-60 秒),而不是最多 3 秒。 当我用它创建pdf时不会发生这种情况,但是当我创建docx时。我还没有尝试过所有不同的选项......
最近可能与新版本的 Windows 有关。当我看到有人在不到 2 个月前更新了一篇关于 word interop 的旧帖子时,我的怀疑变得更加强烈: LINK 见:“2019-09-29 编辑” 我没有尝试过他们在那里写的任何东西。主要是因为我不明白,以前也没有必要。
对我来说,问题出在 2 台 Windows 10 机器上。我的桌面在一周前已经更新到 1903,所以可能是这样。它在我运行 word 2016 的 Windows 服务器上仍然可以正常工作。 我的台式机运行word 365,但我朋友的surface pro 3也是如此,他没有问题。不知道他最近有没有更新他的windows10。
有趣的是,当我用一个空文档正常打开 word 然后再次关闭它时,我遇到了同样的问题。 windows关闭了,但是任务管理器word进程需要很长时间才能关闭,所以ofc让我怀疑。然后我尝试使用设置一词,当我关闭“此应用程序启动时显示开始画面”时,它立即开始关闭该过程。 Ofc 我然后虽然:“太好了,问题解决了”,但没有。使用互操作时仍然存在同样的问题。我尝试通过添加以下行来模拟“显示开始屏幕”的关闭: word.ShowStartupDialog = false; 那只是抛出一个期望,告诉我 ShowStartupDialog 在没有打开窗口时不可用。可能是因为我在不可见模式下运行 word。
我最终通过将退出代码放在这样的线程中来解决问题,最后:
System.Threading.Thread t = new System.Threading.Thread(() =>
{
((Microsoft.Office.Interop.Word._Application)word).Quit(SaveChanges:
Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges, OriginalFormat: Type.Missing);
});
t.IsBackground = true;
t.Start();
然后我可以继续在程序中工作,甚至可以再次调用相同的函数来创建另一个文档。然后它将在旧进程仍在关闭时启动另一个进程。我只是尝试同时关闭3个,这对我来说已经足够了。每个实例也占用了相当多的 cpu 25+%!我的电脑不是新的,但它能够很好地运行 CS GO,所以我真的认为这应该是足够的机器功率:)。
请帮忙找出这个问题的真正原因和解决方案,这样我就可以回到我的原始代码,它已经工作了 4 年。
【问题讨论】:
-
instead of max 3 secs这个文档在哪里? -
办公室 COM 互操作至少有十年的历史,今天仍然无法使用。您是否有机会将此案例限制为仅接受新格式 (.docx)?
-
The office COM interop is at least a decade too old to still be used today基于什么事实,你为什么不能使用呢?老实说,我经常使用它并且没有任何问题;基于较轻的工作负荷。是的,还有其他库,但是如果当前的开发此时阻止使用其他库怎么办? -
Quit() 只能启动关闭,但当仍有实时互操作接口引用时,Word 无法退出。赶时间需要 GC.Collect()。 Look here 了解重要细节。理想情况下,您根本不必这样做,只需使用一个 Word 实例即可完成所有工作,并在工作完成后退出程序。
-
dotnetfiddle.net/7iT6J7 表明即使 COM 引用仍然存在,Quit 也会关闭 Word(将其复制并在本地粘贴到 .NET Framework 控制台应用程序中以运行它)。这与我使用 Word 的经验一致(Excel 行为不同)。