2012-08-10 3 views
0

J'essaie de créer un add-in C# excel 2007, et je veux faire "plus vite" la méthode "beforeSave". J'utilise simplement un thread (et j'essaie aussi la tâche et task.factory) mais il dit toujours la même erreur.C# excel beforesave thread

Le code.

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 

la classe 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 

Sans fil (tout type) son accord, il peut enregistrer le classeur entier. MAIS. avec toute soulution multithread son erreur de lancer. (Exception de HRESULT: 0x800AC472)

Une idée de ce que je fais mal? Ou idée comment le réparer? : D

+3

Je ne recommanderais pas d'essayer d'accéder au cross-thread 'Application'. – climbage

+0

Que se passe-t-il dans BeforeSave qui est "trop ​​lent"? –

+0

Il semble qu'il ne soit pas recommandé d'utiliser un autre thread mais une interface utilisateur: http://social.msdn.microsoft.com/forums/en-US/vsto/thread/9168f9f2-e5bc -4535-8d7d-4e374ab8ff09/ – danielQ

Répondre

0

L'interaction avec Excel via plusieurs threads est un peu difficile - here est une entrée MSDN sur elle. C'est parce que vous interagissez avec Excel via COM, qui utilise des appartements de threads; .NET, cependant, ne le fait pas. En particulier, Excel utilise Appartement Simple rechapé (STA), ce qui signifie que tous les nouveaux threads qui sont créés pour interagir avec Excel doivent être mises à l'état STA:

thread.SetApartmentState(ApartmentState.STA); 

avant d'interagir avec Excel.

Cela laisse toujours une liste complète des problèmes qui peuvent être rencontrés, selon l'article MSDN lié. Dans l'ensemble je ne conseillerais pas d'interagir avec Excel dans plusieurs threads sauf si c'est vraiment nécessaire. Il n'y a aucun problème avec les travailleurs d'arrière-plan qui n'interagissent pas avec Excel, mais les interactions avec l'application Excel via les threads d'arrière-plan sont trop gênantes pour en valoir la peine.

+0

Merci pour cela. (Si je transforme le classeur à la volée en "byte", je peux l'écrire en arrière-plan avec n'importe quelle solution de thread, mais plus lentement qu'une simple application sans fil.) – huncyrus