我正在使用Microsoft Office Interop生成一些Word和PDF文档。在发送了一定数量的文档生成请求后,Microsoft.Office.Interop.Word.Application
停止工作/响应。
从查看任务管理器,我知道当winword.exe
进程消耗了大约63000K内存[请查看快照]时会发生这种情况。我注意到,随着文件生成的每个请求,内存消耗增加大约400-800K,当它达到大约63000K时,它停止工作。 收到第一个请求时,winword.exe
的内存消耗量约为20000K。
这是用于文档生成的代码:
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中并用于进一步的请求处理。
任何人都可以提供任何关于内存消耗持续增加然后停止响应的帮助/指针吗?
答案 0 :(得分:0)
在释放之前尝试关闭应用程序中的文档;如果我没记错的话,像WordApplication.Documents.Close(...)这样的东西?
答案 1 :(得分:0)
因为没有人回复。我尝试了一种解决方法,当WINWORD.EXE生成了大约30个文档时,我退出了Word应用程序。我没有其他选择。
所以,关闭这个问题。
答案 2 :(得分: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!
}