2012-08-10 74 views
0

我嘗試創建一個c#excel 2007加載項,並且我想要「加快」「beforeSave」方法。 我只是使用一個線程(並嘗試任務和task.factory),但它總是說相同的錯誤。c#excel先行線程

代碼。

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 

的backworker類:​​

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

+3

我不會建議嘗試訪問'應用程序'跨線程。 – climbage 2012-08-10 20:07:03

+0

BeforeSave發生了什麼「太慢」 – 2012-08-10 20:08:18

+0

似乎不推薦使用另一個線程,而是UI:http://social.msdn.microsoft.com/forums/en-US/vsto/thread/9168f9f2-e5bc -4535-8d7d-4e374ab8ff09/ – danielQ 2012-08-10 20:16:55

回答

0

通過多線程與Excel交互有點棘手 - here是一個MSDN條目。這是因爲你通過使用線程單元的COM與Excel交互;但是,.NET不。特別是,Excel使用單處治公寓(STA),這意味着那些與Excel交互創建的所有新主題必須設置爲STA狀態:

thread.SetApartmentState(ApartmentState.STA); 

與Excel交互之前。

這仍然留下可能遇到的問題的完整列表,根據鏈接的MSDN文章。總體來說我不會建議在多線程中與Excel交互,除非真的有必要。不與Excel交互的後臺工作人員沒有問題,但通過後臺線程與Excel應用程序交互太麻煩,不值得。

+0

感謝你。 (如果我將工作簿即時打開成「字節」,我可以用任何線程解決方案將它寫入後臺文件,但是這個東西比簡單的無線應用慢)。 – huncyrus 2012-08-11 08:23:54