Freigeben über


Threading in MAPI

Gilt für: Outlook 2013 | Outlook 2016

Ein Thread ist die grundlegende Entität, der ein Betriebssystem CPU-Zeit zuweist. Ein Thread verfügt über eigene Register, Stapel, Priorität und Speicher, verwendet aber einen Adressraum und Prozessressourcen wie Zugriffstoken. Threads teilen sich auch den Arbeitsspeicher, wobei ein Thread liest, was ein anderer Thread geschrieben hat.

MAPI-Clients verwenden die folgenden generischen Threadingmodelle.

Threadingmodell Beschreibung
Single Threading-Modell
Alle -Objekte werden für den einzelnen Thread verwendet.
Apartmentthreadingmodell
Ein Objekt kann nur für den Thread verwendet werden, der es erstellt hat.
Freies Threading- oder Thread-Party-Modell
Ein -Objekt kann für jeden Thread verwendet werden.

MAPI verwendet das freie Threadingmodell und unterstützt threadsichere Objekte, die jederzeit für jeden Thread verwendet werden können. OLE verwendet das Apartmentthreadingmodell. Das Apartmentthreadingmodell unterstützt Objekte, die explizit übertragen werden müssen, wenn ein anderer Thread als der, der das Objekt erstellt hat, dieses Objekt verwenden muss.

Der Mechanismus, den OLE zum Übertragen von Objekten von einem Thread in einen anderen verwendet, wird als Marshalling bezeichnet. Das Marshalling umfasst ein Stubobjekt und ein Proxyobjekt. Diese speziellen Objekte packen die Parameter der Schnittstelle im zu marshallierenden Objekt, übertragen diese Parameter auf den anderen Thread und entpacken sie beim Eintreffen. Ein Konflikt zwischen den beiden Multithreadmodellen tritt auf, wenn ein MAPI-Objekt mit Freithreading mithilfe des OLE-Remoteprozeduraufrufs "lightweight" oder LRPC an einen anderen Prozess gesendet wird. LRPC ändert die Semantik des Objekts von freiem Threading in Apartmentthreading, indem Stub- und Proxyschnittstellen mit dem Apartmentthreadingverhalten zwischen dem Objekt und seinem Aufrufer interposiert werden. Das Bewusstsein für die Situationen in MAPI, die zu diesem Konflikt führen, kann Kunden und Dienstanbietern helfen, Probleme zu verhindern.

Auf ein MAPI-Objekt kann zugegriffen werden:

  • Durch direkte Aufrufe der Methoden mithilfe eines Schnittstellenzeigers, der von einem Dienstanbieter oder einer MAPI zurückgegeben wird, die mit dem Prozess des Clients verknüpft ist, z. B. das von MAPILogonEx zurückgegebene Sitzungsobjekt.

  • Durch indirekte Aufrufe der zugehörigen Methoden mithilfe eines Schnittstellenzeigers, der von einem beliebigen Dienstanbieter zurückgegeben wird, z. B. das Ordnerobjekt, das aus einem anderen Ordner in IMAPIFolder::CopyFolder kopiert wurde.

  • Über eine Rückruffunktion, z. B. die IMAPIAdviseSink::OnNotify-Methode , die in einem Advise-Aufruf an einen Dienstanbieter oder an MAPI übergeben wird, oder die Methoden, die den Fortschritt bei einem langwierigen Vorgang anzeigen können.