2016-09-28 1 views
0

Ich habe eine C# GUI-Anwendungen, die einige Excel-Aufgaben über die offiziellen office interop COM-Bibliotheken automatisiert. Ich stelle meinen eigenen Event-Handler für das Ereignis zur Verfügung.Wie Aktualisieren von GUI-Steuerelementen aus einem Excel-Interop-Ereignis-Thread?

Ich glaube, dass die Interop-Bibliotheken diesen Ereignishandler aus einem Thread aufrufen, den er erstellt hat. Mein Problem ist, dass ich einige GUI-Komponenten basierend auf diesem Ereignis aktualisieren muss, aber ich kann keine Aktualisierungsoperationen auf der GUI über diese Threads durchführen.

Meine Frage ist, von diesem Excel-Interop-Event-Handler, die ich glaube, ist in einem eigenen Thread, wie kann ich sicher meine GUI auf eine Thread-sichere Weise aktualisieren?

Ich frage dies, weil ich Laufzeitfehler über Cross-Thread-Operationen beim Aktualisieren der GUI derzeit erhalte.

Edit: Ich glaube, die verknüpften und vorgeschlagenen möglichen Antworten sind für WPF. Meine Anwendung ist nicht WPF, es sind die älteren WinForms. Ich sehe keine Application.Current Eigenschaft.

+0

Siehe dies: http://stackoverflow.com/questions/9732709/the-calling-thread-cannot-access-this-object-cause-a-different-thread-owns-it – PaulF

+0

Danke für den Link. Das scheint mir in die richtige Richtung zu zeigen, aber diese Antworten scheinen für WPF zu sein. Ich benutze die älteren WinForms. Ich sehe keine 'Application.Current'-Eigenschaft. – Ryan

+0

@Ryan verwenden Sie einfach 'someControl.Invoke (' von der Steuerung, die den Fehler wirft, die den Code für den richtigen Thread für das Steuerelement aktivieren wird. –

Antwort

1

Verwenden Sie einfach

private void excel_SheetActivate(object activatedSheet) 
{ 
    if (someControl.InvokeRequired) 
    { 
     someControl.Invoke((WorkbookEvents_SheetActivateEventHandler)excel_SheetActivate, activatedSheet); 
    } 
    else 
    { 
     someControl.Text = //... 
    } 
} 

wo someControl die Steuerung, die den Fehler wirft, die sehen überprüfen, ob ein invoke erforderlich ist, und wenn es es ist die gleiche Funktion mit demselben wieder aufrufen Argumente für den richtigen Thread für dieses Steuerelement.

Verwandte Themen