1

我尝试创建 ac# excel 2007 Add-In,并且我想做“更快”的“beforeSave”方法。我只是使用一个线程(并尝试任务和 task.factory),但它总是说同样的错误。

编码。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    { 
         this.Application.WorkbookBeforeSave += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler(Application_WorkbookBeforeSave);

}// thisAddIn_startup method end
public void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
    {
         backendworker bwfs = new backendworker();// its a custom standalone class!
         Task task1 = new Task(() => bwfs.MyBeforeSave(this.Application.ActiveWorkbook));
         task1.Start();
}// application_workbookbeforesave method end

后勤班:

public class backendworker
{

    // BeforeSave method
    public void MyBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb)
    {
          Wb.SaveCopyAs("c:\\temp\\temp.xls");
    }// method end
}// class end

没有线程(任何类型)都可以,它可以保存整个工作簿。但。对于任何多线程解决方案,它的抛出错误。(来自 HRESULT 的异常:0x800AC472

知道我做错了什么吗?或者想法如何解决它?:D

4

1 回答 1

0

通过多个线程与 Excel 交互有点棘手——这里有一个 MSDN 条目。这是因为您通过 COM 与 Excel 交互,COM 使用线程单元;然而,.NET 没有。特别是,Excel 使用 Single-Treaded Apartment (STA),这意味着为与 Excel 交互而创建的所有新线程都必须设置为 STA 状态:

thread.SetApartmentState(ApartmentState.STA);

在与 Excel 交互之前。

根据链接的 MSDN 文章,这仍然留下了可能遇到的问题的完整列表。总的来说,除非确实有必要,否则我不建议在多个线程中与 Excel 进行交互。不与 Excel 交互的后台工作人员没有问题,但通过后台线程与 Excel 应用程序交互太麻烦,不值得。

于 2012-08-10T22:07:35.040 回答