Share via


Threadingunterstützung in Office

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-App lizenzen 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 wird als Sta-Modell (SingleThreaded Apartment) bezeichnet. 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 features available by Office-App lication and project type.

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

  • Multithread-Konzepte für COM

  • Parallelität

  • Synchronization

  • Marshalling

    Allgemeine Informationen zum Multithreading finden Sie unter Verwalteter Threading.

    Office wird im Standard 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 Standard 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 gleichzeitig anstelle einer Aufgabe auszuführen, gefolgt von der anderen, was zu einer reibungsloseren Ausführung führen sollte (der Standard Grund für die Verwendung mehrerer Threads). Beispielsweise können Sie ihren Ereigniscode im Standard Excel-UI-Thread und in einem Hintergrundthread ausführen, der 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-App lizenzierung vorgibt, wird der Aufruf automatisch über die STA-Grenze gemarstet. Es besteht jedoch keine Garantie dafür, dass die Office-App lizenzierung den Aufruf zum Zeitpunkt der Verarbeitung des Hintergrundthreads verarbeiten kann. Es gibt einige Möglichkeiten:

  1. Die Office-App lizenzierung muss Nachrichten für den Anruf pumpen, um die Möglichkeit zu haben, einzutreten. Wenn sie eine schwere Verarbeitung durchführt, ohne dies zu erzielen, kann dies Zeit in Anspruch nehmen.

  2. Wenn sich bereits ein anderer logischer Thread in der Wohnung befindet, kann der neue Thread nicht eingegeben werden. Dies geschieht häufig, wenn ein logischer Thread in die Office-App lizenzierung eintritt und dann einen erneuten Aufruf an die Wohnung des Anrufers vorgibt. Die Anwendung wird blockiert, bis dieser Aufruf zurückgegeben wird.

  3. Excel befindet sich möglicherweise in einem Zustand, sodass er einen eingehenden Anruf nicht sofort verarbeiten kann. Die Office-App lizenzierung 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.

Starten des Threads richtig

Wenn Sie einen neuen STA-Thread erstellen, legen Sie den Apartmentzustand auf STA fest, bevor Sie den Thread starten. Das folgende Codebeispiel veranschaulicht, wie Sie dabei vorgehen:

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.

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 formularlose Verwaltete Modus; Sie sollten jedoch nicht in einem Hintergrundthread verwendet werden.