Share via


Threading-Unterstützung in Office

Aktualisiert: November 2007

Dieses Thema enthält Informationen über die Unterstützung von Threading im Microsoft Office-Objektmodell. Das Office-Objektmodell ist nicht threadsicher. Es ist jedoch möglich, in einer Office-Projektmappe mit mehreren Threads zu arbeiten. Office-Anwendungen sind COM-Server (Component Object Model). COM ermöglicht Clients, COM-Server in beliebigen Threads aufzurufen. Für nicht threadsichere COM-Server stellt COM einen Mechanismus zur Verfügung, der gleichzeitige Aufrufe serialisiert, sodass auf dem Server jeweils nur ein logischer Thread ausgeführt wird. Dieser Mechanismus wird als Singlethread-Apartment-Modell (STA) bezeichnet. Durch das Serialisieren der Aufrufe können Aufrufe für einige Zeit blockiert werden, wenn der Server ausgelastet ist oder andere Aufrufe in einem Hintergrundthread bearbeitet.

Erforderliche Kenntnisse für die Verwendung mehrerer Threads

Um mit mehreren Threads zu arbeiten, müssen Sie zumindest über Grundkenntnisse der folgenden Aspekte von Multithreading verfügen:

  • Windows-APIs

  • COM-Multithreading-Konzepte

  • Parallelität

  • Synchronisierung

  • Marshalling

Allgemeine Informationen über Multithreading finden Sie unter Multithreading in Komponenten.

Office wird im Haupt-STA ausgeführt. Das Verständnis der Auswirkungen dieser Arbeitsweise ermöglicht das Verwenden mehrerer Threads in Office.

Grundszenario für Multithreading

Visual Studio Tools for Office-Code wird immer im primären UI-Thread ausgeführt. Es kann sinnvoll sein, die Anwendungsleistung durch das Ausführen einer separaten Aufgabe in einem Hintergrundthread zu verbessern. Ziel ist es, zwei Aufgaben nicht hintereinander auszuführen, sondern scheinbar gleichzeitig, wodurch sich eine reibungslosere Ausführung ergeben sollte (der Hauptgrund für den Einsatz mehrerer Threads). Angenommen, Ihr Ereigniscode wird im Primärthread der Excel-UI ausgeführt, und in einem Hintergrundthread führen Sie eine Aufgabe aus, mit der Daten von einem Server gesammelt und damit Zellen in der Excel-UI aktualisiert werden.

Hintergrundthreads, die das Office-Objektmodell aufrufen

Wenn ein Hintergrundthread die Office-Anwendung aufruft, wird der Aufruf automatisch über die STA-Grenze hinweg gemarshallt. Es ist jedoch nicht gewährleistet, dass die Office-Anwendung den Aufruf dann behandeln kann, wenn er vom Hintergrundthread erfolgt. Es gibt folgende Möglichkeiten:

  1. Die Office-Anwendung muss Meldungen zeitlich verschieben, damit der Aufruf eingehen kann. Wenn das Programm mit Arbeitsprozessen ausgelastet ist, kann dies einige Zeit in Anspruch nehmen.

  2. Wenn sich bereits ein anderer logischer Thread im Apartment befindet, kann der neue Thread nicht eingehen. Dies ist häufig der Fall, wenn ein logischer Thread in die Office-Anwendung eingeht und einen Wiedereintrittsaufruf zum Apartment des Aufrufers ausführt. Die Anwendung wartet auf die Rückgabe des Aufrufs und ist für diese Zeit blockiert.

  3. Excel ist möglicherweise in einem Zustand, in dem es nicht sofort einen eingehenden Aufruf behandeln kann. Zum Beispiel könnte die Office-Anwendung ein modales Dialogfeld anzeigen.

Für die Möglichkeiten 2 und 3 stellt COM eine Schnittstelle mit dem Namen IMessageFilter bereit. Wenn der Server diese implementiert, gehen alle Aufrufe durch die HandleIncomingCall-Methode ein. Bei Möglichkeit 2 werden Aufrufe automatisch zurückgewiesen. Bei Möglichkeit 3 kann der Server den Aufruf in Abhängigkeit von den Umständen zurückweisen. Wenn der Aufruf zurückgewiesen wird, muss der Aufrufer über den nächsten Schritt entscheiden. Normalerweise implementiert der Aufrufer IMessageFilter, sodass eine Benachrichtigung über den durch die RetryRejectedCall-Methode zurückgewiesenen Aufruf angezeigt wird.

Allerdings werden im Visual Studio Tools for Office-Fall alle zurückgewiesenen Aufrufe durch COM-Interop in eine System.Runtime.InteropServices.COMException ("Der Meldungsfilter gibt an, dass die Anwendung ausgelastet ist") umgewandelt. Wenn Sie einen Objektmodell-Aufruf in einem Hintergrundthread ausführen, müssen Sie stets darauf vorbereitet sein, diese Ausnahme zu behandeln. Normalerweise bedeutet dies, dass der Vorgang für eine bestimmte Zeit wiederholt wird, bevor anschließend ein Dialogfeld angezeigt wird. Sie können den Hintergrundthread jedoch auch als STA erstellen und anschließend einen Meldungsfilter für diesen Thread registrieren, der diesen Fall behandeln soll.

Richtiges Starten des Threads

Legen Sie beim Erstellen eines neuen STA-Threads als Apartmentzustand STA fest, bevor Sie den Thread starten:

Dim t As New System.Threading.Thread(AddressOf AnObject.aMethod)

t.SetApartmentState(System.Threading.ApartmentState.STA)
t.Start()
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);

t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();

Weitere Informationen finden Sie unter Empfohlene Vorgehensweise für das verwaltete Threading.

Formulare ohne Modus

Ein Formular ohne Modus ermöglicht eine Art Interaktion mit der Anwendung, während es angezeigt wird. Der Benutzer interagiert mit dem Formular und das Formular mit der Anwendung, ohne zu schließen. Das Office-Objektmodell unterstützt zwar verwaltete nicht modale Formulare, sie sollten jedoch nicht in einem Hintergrundthread verwendet werden.

Siehe auch

Konzepte

Erstellen von Office-Projektmappen in Visual Studio

Referenz

Threading (C#-Programmierhandbuch)

Weitere Ressourcen

Multithreading in Komponenten

Verwaltetes Threading

Multithreading in Visual Basic

Verwenden von Threads und Threading