如果app在使用互操作的读/写期间关闭,则Interop不会释放excel服务

时间:2016-04-08 14:40:47

标签: c# wpf excel excel-interop

我正在创建一个WPF应用程序。当它第一次加载时,它使用互操作从3个不同的excel文件中读取数据,如果它留给自己的设备,一切都很好,所有服务都正常结束,但是如果你在完成阅读之前关闭应用程序并获得释放所有内容服务将在手动关闭之前保持打开状态。

下面是我所拥有的代码的一些例子,这样你就可以了解我是如何做的。

这就是我在Excel类中调用方法的方法*注意我的Excel类是静态的

    Parallel.Invoke(
            () => _someList1 =
                Excel.ReadFile1(path + "ExcelFile1.xlsx"),
            () => _someList2 =
                Excel.ReadFile2(path + "ExcelFile2.xlsx"),
            () => _someList3 =
                Excel.ReadFile3(path + "ExcelFile3.xlsx"));

以下是我的Excel类

中的方法示例
    public static IList<SomeObject> ReadFile1(string absolutePath)
    {
        object[,] values = StartRead(absolutePath);

        for (int i = 2; i < values.GetLength(0) + 1; i++)
        {
            //doing stuff in here
        }
        return mylist<SomeObject>;
    }

    private static object[,] StartRead(string absolutePath)
    {
        Application excel = new Application();
        Workbook workBook = excel.Workbooks.Open(absolutePath);
        Worksheet sheet = (Worksheet)workBook.Worksheets[1];
        Range range = sheet.Range["A1"];

        range = range.End[XlDirection.xlToRight];
        range = range.End[XlDirection.xlDown];
        string downAddress = range.Address[false, false];
        range = sheet.Range["A1", downAddress];

        object[,] values = (object[,])range.Value2;

        workBook.Close(true);
        excel.Quit();

        ReleaseExcel(range, sheet, workBook, excel);

        return values;
    }
    private static void ReleaseExcel(Range range, Worksheet worksheet, Workbook workbook, Application application)
    {
        if (range != null)
        {
            Marshal.ReleaseComObject(range);
        }

        if (worksheet != null)
        {
            Marshal.ReleaseComObject(worksheet);
        }

        if (workbook != null)
        {
            Marshal.ReleaseComObject(workbook);
        }

        if (application != null)
        {
            Marshal.ReleaseComObject(application);
        }
    }

因此,如果应用程序在有机会调用ReleaseExcel之前关闭,那么问题就会明显发生。在某种程度上我可以让wpf应用程序等到所有excel服务在关闭之前发布。

编辑**和excel服务我的意思是流程

0 个答案:

没有答案