Interop字处理不会立即关闭

时间:2014-08-21 13:54:42

标签: c# wpf multithreading ms-word office-interop

我正在使用多线程WPF应用程序中的互操作词库将word文档导出为PDF,然后使用MagickNet库将它们转换为PNG。

private void generateImagesFromOfficeDoc(Document currentDocument, CustomThread thread = null)
    {
        var token = tokenSource.Token;
        Microsoft.Office.Interop.Word.Application wordApplication = null;

        string[] filePath = currentDocument.OriginalPath.Split('\\');
        currentDocument.Filename = filePath[filePath.Length - 1].Trim();

        string fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(currentDocument.Filename).Trim();
        string destinationPath;

        destinationPath = pngPath + "\\" + currentDocument.CreatedDate.Year.ToString() + "\\" + currentDocument.Specialty + "\\" + currentDocument.CreatedDate.Month + "\\" +
            currentDocument.CreatedDate.Day + "\\" + fileNameWithoutExtension;

        string pdfPath = magickNETTempDir + "\\" + fileNameWithoutExtension + ".pdf";
        string pdfName = fileNameWithoutExtension + ".pdf";
        string tempFile = magickNETTempDir + "\\" + currentDocument.Filename;

        try
        {
            // Copying the file from the original location to the temp folder. ** This is because impersonation have issues with the interop library.
            File.Copy(currentDocument.OriginalPath, tempFile);

            // Create the directory if it does not exist.
            if (!Directory.Exists(destinationPath))
            {
                Directory.CreateDirectory(destinationPath);
            }

            /************ CONVERTING THE DOCUMENT TO PDF ***************/
            wordApplication = new Microsoft.Office.Interop.Word.Application();
            // Opening the word document
            var wordDocument = wordApplication.Documents.Open(tempFile);
            var pageCount = wordDocument.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wdStatisticPages, false);
            // Exporting the document to the PDF
            wordDocument.ExportAsFixedFormat(pdfPath, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
            // Closing the document and the application.
            ((Microsoft.Office.Interop.Word._Document)wordDocument).Close(false);
            ((Microsoft.Office.Interop.Word._Application)wordApplication).Quit(false);
   }

每个线程都会打开一个单词应用程序,并在导出文档后关闭它。在同一方法中,我将导出的PDF转换为PNG,然后删除临时PDF(代码被排除,因为我认为它与问题无关)。

这个过程完成了它的工作但是由于我正在转换成千上万的文档,因此我在后台吃掉了很多文字处理程序。这些进程最终会自行关闭,但速度非常慢,因此我最终会在后台处理越来越多的进程。这不会发生在所有机器上,也不会发生在每个文档上,因此我不确定会出现什么问题。

有没有办法强行关闭它们?我尝试过按名称杀死进程的方法,但这需要应用程序窗口可见,这是我不想要的。

2 个答案:

答案 0 :(得分:3)

使用Microsoft.Office.Interop.Excel dll时遇到了类似的问题。我发现在Excel从Windows任务管理器进程选项卡中消失之前,我必须释放我一直使用的所有COM对象。为了清楚起见,我关闭了应用程序,但是在我释放COM对象之前,它的进程在任务管理器中仍然可见。尝试这样的事情:

private void ReleaseComObjects(bool isQuitting)
{
    try
    {
        if (isQuitting)
        {
            workbook.Close(false, missing, missing); 
            excelApplication.Quit();
        }
        Marshal.ReleaseComObject(workbooks);
        Marshal.ReleaseComObject(workbook);
        if (worksheets != null) Marshal.ReleaseComObject(worksheets);
        Marshal.ReleaseComObject(worksheet);
        Marshal.ReleaseComObject(excelApplication);
        workbook = null;
        worksheets = null;
        worksheet = null;
        excelApplication = null;
    }
    catch { }
    finally { GC.Collect(); }
}

private void ReleaseComObjects()
{
    ReleaseComObjects(false);
}

答案 1 :(得分:-1)

Marshal.ReleaseComObject(wordDocument)在Web应用程序中花费大约15到20秒