【问题标题】:c# MSOffice Interop Word will not kill winword.exec# MSOffice Interop Word 不会杀死 winword.exe
【发布时间】:2011-10-27 13:27:20
【问题描述】:

我正在编写一个需要 MSWord 文档解析器的应用程序。

我正在使用 Microsoft.Office.Interop.Word.Document 从文档中提取文本,但即使我使用 doc.Close() 文档,从 taskManager 我可以看到 winword.exe 没有被杀死,在解析了几十个文档之后,它会消耗很多资源。

close() 方法不对吗?

请帮助我并指出正确的方向,以正确终止这些进程。 =)

~~~更新~~~

感谢所有帮助。我使用 app.quit() 并运行了一个循环来检查进程并解决问题! =)

【问题讨论】:

  • 这是垃圾收集器工作方式的副作用。您可能不会生成足够的垃圾来触发收集。在这种非常特殊的情况下,调用 GC.Collect + GC.WaitForPendingFinalizers 是可以的。
  • @Hans Passant 与垃圾收集器没有任何关系。他没有调用正确的清理方法。

标签: c# interop zombie-process


【解决方案1】:

你打电话给Application.Quit吗,另外,因为你在做互操作,所以发布RCW wrapper可能是值得的。

所以基本上是这样的:

yourWordAppObject.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(yourWordAppObject);

注意有些人使用:ReleaseComObject,但也有一些 potential pitfalls

【讨论】:

    【解决方案2】:

    您必须使用 app.quit() 退出应用程序实例。 Document.close() 只会关闭文档。我还建议您在完成处理后设置 app.visible = true 以便您的用户可以在其他所有操作都失败时自行关闭它。

    【讨论】:

    • Application.Quit 实际上并没有终止进程,用户也没有关闭窗口。在释放所有自动化接口之前,Word 无法退出。
    • @Hans Passant 哦该死,你是对的。我们该如何做呢?特别是在您希望文档对用户可见并且也被他们关闭的情况下。
    【解决方案3】:

    执行app.Quit()后,必须做app = null;根据我的经验,这将防止剩余的进程徘徊。请务必在您的异常处理程序中执行 app.Quit() 和 app = null。

    【讨论】:

      【解决方案4】:

      如果您想结束进程,您需要在 Application 对象上调用 Quit - 请参阅 http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.applicationclass.quit%28v=office.14%29.aspx

      【讨论】:

        【解决方案5】:

        我在想 close 只是处理在 word 中打开的文档。请记住,您可以使用 1 个应用程序打开超过 1 个 word 文档。您可能想尝试使用 dispose 方法,或查看单词 objects quit/exit methods(不记得有一段时间了)。

        【讨论】:

          猜你喜欢
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-24
          • 1970-01-01
          • 2018-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多