如果应用程序在使用interop进行读取/写入时closures,则互操作性不会释放Excel服务

我正在创build一个WPF应用程序。 当它第一次加载它从3个不同的Excel文件使用互操作,如果它留给自己的设备读取数据一切都很好,所有的服务都正常结束,但是如果你closures应用程序之前,它完成阅读,并释放一切服务将保持开放,直到手动closures。

下面是我已经有的代码的一些例子,这样你就可以知道我是如何做所有事情的。

这就是我如何在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); } } 

因此,如果应用程序在被调用之前closures,那么问题就很明显了。ReleaseExcel()是否有一些方法可以让wpf应用程序等待,直到所有的excel服务在closures之前都被释放。

编辑**和Excel的服务,我的意思是过程