0

我正在使用 Microsoft Office Interop 生成一些 Word 和 PDF 文档。在发送了一定数量的文档生成请求后,Microsoft.Office.Interop.Word.Application停止工作/响应。

通过查看任务管理器,我知道当winword.exe进程消耗了大约 63000K 内存时会发生这种情况[请查看快照]。我注意到每次生成文档请求时,内存消耗都会增加大约 400-800K,当达到大约 63000K 时,它就会停止工作。当收到第一个请求winword.exe时,内存消耗大约为 20000K。

WINWORD.EXE进程的内存消耗

这是用于文档生成的代码:

object templateName = "d:\\xyz.dotm";
object missing = System.Reflection.Missing.Value;
wordDocument = this.WordApplication.Documents.Add(ref missing, ref missing, ref missing, ref missing);
wordDocument.Range(ref missing, ref missing).Text = "";
wordDocument.set_AttachedTemplate(ref templateName);

wordDocument = this.WordApplication.Documents.Open(
ref objSourceFilePath, ref oFalse, ref oTrue,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing);

 wordDocument.ExportAsFixedFormat(
strTargetPath,
targetFormat,
paramOpenAfterExport,
paramExportOptimizeFor,
paramExportRange,
paramStartPage,
paramEndPage,
paramExportItem,
paramIncludeDocProps,
paramKeepIRM,
paramCreateBookmarks,
paramDocStructureTags,
paramBitmapMissingFonts,
paramUseISO19005_1,
ref oMissing);

finally
{
    if (wordDocument != null)
    {
        wordDocument.Close(ref oFalse, ref oMissing, ref oMissing);
        Marshal.FinalReleaseComObject(wordDocument);
        wordDocument = null;
    }
}

我不会丢弃WordApplication类或释放它,因为它被保存在 ApplicationPool 中并用于进一步的请求处理。

任何人都可以提供有关为什么内存消耗不断增加然后停止响应的任何帮助/指示吗?

4

3 回答 3

0

在发布之前尝试在应用程序中关闭文档;如果我没记错的话,像 WordApplication.Documents.Close(...) 之类的东西?

于 2013-08-29T13:26:16.763 回答
0

因为没有人回复。我尝试了一个解决方法,当 WINWORD.EXE 生成了大约 30 个文档时,我退出了 Word 应用程序。我没有其他选择。

所以,结束这个问题。

于 2013-09-04T18:06:54.987 回答
0
public void DisposeExcelInstance()
{
    app.DisplayAlerts = false;
    workBook.Close(null, null, null);
    app.Workbooks.Close();
    app.Quit();
    if (workSheet != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
    if (workBook != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
    if (app != null)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    workSheet = null;
    workBook = null;
    app = null;
    GC.Collect(); // force final cleanup!
}
于 2014-02-23T08:53:38.760 回答