Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält Informationen dazu, wie Threading im Microsoft Office-Objektmodell unterstützt wird. Das Office-Objektmodell ist nicht threadsicher, aber es ist möglich, mit mehreren Threads in einer Office-Lösung zu arbeiten. Office-Anwendungen sind COM-Server (Component Object Model). COM ermöglicht Clients das Aufrufen von COM-Servern in beliebigen Threads. Für COM-Server, die nicht threadsicher sind, stellt COM einen Mechanismus zum Serialisieren gleichzeitiger Aufrufe bereit, sodass immer nur ein logischer Thread auf dem Server ausgeführt wird. Dieser Mechanismus ist bekannt als das STA-Modell (Single-Threaded Apartment). Da Aufrufe serialisiert werden, werden Anrufer möglicherweise für Zeiträume blockiert, während der Server ausgelastet ist oder andere Aufrufe in einem Hintergrundthread verarbeitet.
Gilt für: Die Informationen in diesem Thema gelten für Projekte auf Dokumentebene und VSTO-Add-In-Projekte. Siehe Verfügbare Features nach Office-Anwendung und Projekttyp.
Erforderliches Wissen bei der Verwendung mehrerer Threads
Um mit mehreren Threads zu arbeiten, müssen Sie mindestens grundlegende Kenntnisse über die folgenden Aspekte des Multithreadings haben:
Windows-APIs
COM-Multithreading-Konzepte
Konkurrenz
Synchronization
Marshalling
Allgemeine Informationen zum Multithreading finden Sie unter Verwalteter Threading.
Office wird im Haupt-STA ausgeführt. Das Verständnis der Auswirkungen dieser Vorgehensweise macht es möglich, zu verstehen, wie mehrere Threads mit Office verwendet werden.
Einfaches Multithreading-Szenario
Code in Office-Lösungen wird immer im Haupt-UI-Thread ausgeführt. Möglicherweise möchten Sie die Anwendungsleistung glätten, indem Sie eine separate Aufgabe in einem Hintergrundthread ausführen. Das Ziel besteht darin, zwei Aufgaben scheinbar auf einmal statt einer Aufgabe auszuführen, gefolgt von der anderen, was zu einer reibungsloseren Ausführung führen sollte (der Hauptgrund für die Verwendung mehrerer Threads). Beispielsweise können Sie ihren Ereigniscode im Hauptthread der Excel-Benutzeroberfläche haben, und in einem Hintergrundthread können Sie eine Aufgabe ausführen, die Daten von einem Server sammelt und Zellen auf der Excel-Benutzeroberfläche mit den Daten vom Server aktualisiert.
Hintergrundthreads, die das Office-Objektmodell aufrufen
Wenn ein Hintergrundthread einen Aufruf der Office-Anwendung vorgibt, wird der Aufruf automatisch über die STA-Grenze gemarstet. Es besteht jedoch keine Garantie dafür, dass die Office-Anwendung den Aufruf zu dem Zeitpunkt verarbeiten kann, an dem der Hintergrundthread ihn aufruft. Es gibt mehrere Möglichkeiten:
Die Office-Anwendung muss Nachrichten für den Anruf pumpen, um die Möglichkeit zur Eingabe zu erhalten. Wenn eine lange Verarbeitung ohne Unterbrechung erfolgt, kann dies Zeit in Anspruch nehmen.
Wenn sich bereits ein anderer logischer Thread im Apartment befindet, kann der neue Thread nicht betreten werden. Dies geschieht häufig, wenn ein logischer Thread in die Office-Anwendung eintritt und dann einen erneuten Rückruf an die Wohnung des Anrufers vorgibt. Die Anwendung wird blockiert, bis dieser Aufruf zurückgegeben wird.
Excel befindet sich möglicherweise in einem Zustand, sodass er einen eingehenden Anruf nicht sofort verarbeiten kann. Die Office-Anwendung kann z. B. ein modales Dialogfeld anzeigen.
Für Die Möglichkeiten 2 und 3 bietet COM die IMessageFilter-Schnittstelle . Wenn der Server dies implementiert, werden alle Aufrufe über die HandleIncomingCall-Methode eingegeben. Für Die Möglichkeit 2 werden Anrufe automatisch abgelehnt. Für Die Möglichkeit 3 kann der Server den Anruf je nach den Umständen ablehnen. Wenn der Anruf abgelehnt wird, muss der Anrufer entscheiden, was zu tun ist. Normalerweise implementiert der Aufrufer IMessageFilter, in diesem Fall wird er von der RetryRejectedCall-Methode über die Ablehnung benachrichtigt.
Im Falle von Lösungen, die mit den Office-Entwicklungstools in Visual Studio erstellt wurden, konvertiert COM-Interop jedoch alle abgelehnten Aufrufe in einen COMException ("Der Nachrichtenfilter hat angegeben, dass die Anwendung ausgelastet ist"). Wenn Sie einen Objektmodellaufruf für einen Hintergrundthread ausführen, müssen Sie darauf vorbereitet sein, diese Ausnahme zu behandeln. In der Regel umfasst dies einen erneuten Versuch für eine bestimmte Zeitspanne und dann das Anzeigen eines Dialogfelds. Sie können den Hintergrundthread jedoch auch als STA erstellen und dann einen Nachrichtenfilter für diesen Thread registrieren, um diesen Fall zu behandeln.
Den Thread korrekt starten
Wenn Sie einen neuen STA-Thread erstellen, legen Sie den Apartmentzustand auf STA fest, bevor Sie den Thread starten. Im folgenden Codebeispiel wird dies veranschaulicht.
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();
Weitere Informationen finden Sie unter Bewährte Methoden für verwaltetes Threading.
Moduslose Formulare
Ein modusloses Formular ermöglicht eine Art von Interaktion mit der Anwendung, während das Formular angezeigt wird. Der Benutzer interagiert mit dem Formular, und das Formular interagiert mit der Anwendung ohne Schließen. Das Office-Objektmodell unterstützt verwaltete modelless Formulare; diese sollten jedoch nicht auf einem Hintergrundthread verwendet werden.