使用BackgroundWorker将使Excel进程在closuresExcel后运行

我正在使用C#中的Excel加载项,在运行模拟时显示进度条。 我想要一个BackgroundWorkerasynchronous运行模拟,并报告进度条窗体的进度。

模拟方法需要对当前Excel COM应用程序的引用。 我有一个名为ThisAddin的类,它实现了ExcelDna.Integration.IExcelAddIn接口,并有一个返回应用程序的静态属性。

但是,只要后台工作人员以任何方式尝试使用该应用程序,即使退出Excel,也将使Excel进程继续运行。

例如,如果我简单地在Excel应用程序中设置属性,如下所示:

 void backgroundworker_DoWork(object sender, DoWorkEventArgs e) { ThisAddIn.App.DisplayStatusBar = true; } 

然后,在运行加载和closures的Excel后,我仍然有一个Excel进程在我的任务pipe理器中运行。

有没有办法确保这个过程被杀死? 我不知何故在后台工作人员创build应用程序的另一个实例吗? 我不明白,因为如果我从后台工作人员的应用程序调用quit(),它将closures整个应用程序,该过程仍将继续运行!

当后台工作完成时,我已经确定调用dispose()并中止当前线程。 我已经使用了这里build议的“AbortableBackgroundWorker”类。 但是,这仍然不能解决我的问题。

问题是,你持有的Excel对象比你想象的要长。 我见过的两个选项成功使用:

  1. 使用Marshal.ReleaseComObject您触摸的每个Excel对象。
  2. 创build一个新的AppDomain并完成所有的Excel工作。 然后卸载整个AppDomain,这将确保任何延迟的对象将被丢弃。

选项1比较容易理解,但更脆弱,容易出错。