使用BackgroundWorker将关闭Excel后保持Excel进程运行

时间:2014-11-26 21:13:04

标签: c# multithreading excel backgroundworker excel-interop

我正在使用C#中的Excel加载项,在运行模拟时显示进度条。我希望BackgroundWorker以异步方式运行模拟,并将进度报告回进度条表单。

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

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

例如,如果我只是在Excel应用中设置属性,那么:

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

然后在运行加载项并关闭Excel之后,我仍然会在我的任务管理器中运行Excel进程。

有没有办法确保进程被杀死?我在某种程度上在后台工作程序中创建应用程序的另一个实例?我不明白,因为如果我在后台工作程序中调用应用程序上的quit(),它将关闭整个应用程序,并且该过程仍将继续运行!

当后台工作人员完成时,我确保在其上调用dispose()并中止其当前线程。我使用的是#AbortableBackgroundWorker"建议的类here。但这仍然无法解决我的问题。

1 个答案:

答案 0 :(得分:1)

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

  1. 在您触摸的每个Excel对象上使用Marshal.ReleaseComObject。
  2. 创建一个新的AppDomain,并在其中完成所有Excel工作。然后卸载整个AppDomain,以确保处理任何延迟对象。
  3. 选项1更容易理解,但更脆弱且容易出错。