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
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 に答える
0

ドキュメントをリリースする前に、アプリケーションでドキュメントを閉じてみてください。正しく思い出せば、WordApplication.Documents.Close(...) のようなものですか?

于 2013-08-29T13:26:16.763 に答える
0

誰も答えていないので。WINWORD.EXE が約 30 個のドキュメントを生成したときに、Word アプリケーションを終了しました。私には他に選択肢はありません。

それで、この質問を閉じます。

于 2013-09-04T18:06:54.987 に答える