Partager via


Threading dans MAPI

S’applique à : Outlook 2013 | Outlook 2016

Un thread est l’entité de base à laquelle un système d’exploitation alloue du temps processeur. Un thread a ses propres registres, pile, priorité et stockage, mais partage un espace d’adressage et des ressources de processus telles que les jetons d’accès. Les threads partagent également de la mémoire, avec un thread lisant ce qu’un autre thread a écrit.

Les clients MAPI utilisent les modèles de thread génériques suivants.

Modèle de thread Description
Modèle de thread unique
Tous les objets sont utilisés sur le thread unique.
Modèle de thread d’appartement
Un objet ne peut être utilisé que sur le thread qui l’a créé.
Threading libre, ou modèle thread-party,
Un objet peut être utilisé sur n’importe quel thread.

MAPI utilise le modèle de thread libre, prenant en charge les objets thread-safe qui peuvent être utilisés sur n’importe quel thread à tout moment. OLE utilise le modèle de thread d’appartement. Le modèle de thread d’appartement prend en charge les objets qui doivent être transférés explicitement lorsqu’un thread autre que celui qui a créé l’objet doit utiliser cet objet.

Le mécanisme utilisé par OLE pour transférer des objets d’un thread à un autre est appelé marshaling. Le marshaling implique un objet stub et un objet proxy. Ces objets spéciaux empaquetent les paramètres de l’interface dans l’objet à marshaler, transfèrent ces paramètres à l’autre thread et les déballent à l’arrivée. Un conflit entre les deux modèles multithread se produit lorsqu’un objet MAPI à thread libre est envoyé à un autre processus à l’aide de l’appel de procédure distante OLE « allégé » ou LRPC. LRPC modifie la sémantique de l’objet du thread libre au thread d’appartement en interposant les interfaces stub et proxy avec le comportement de thread d’appartement entre l’objet et son appelant. La connaissance des situations dans MAPI qui mènent à ce conflit peut aider les clients et les fournisseurs de services à éviter que des problèmes ne se produisent.

Un objet MAPI est accessible :

  • Par le biais d’appels directs à ses méthodes à l’aide d’un pointeur d’interface retourné par un fournisseur de services ou MAPI lié au processus du client, tel que l’objet de session retourné par MAPILogonEx.

  • Par le biais d’appels indirects à ses méthodes à l’aide d’un pointeur d’interface retourné par n’importe quel fournisseur de services, tel que l’objet dossier copié à partir d’un autre dossier dans IMAPIFolder ::CopyFolder.

  • Via une fonction de rappel, telle que la méthode IMAPIAdviseSink ::OnNotify transmise à un fournisseur de services ou à MAPI dans un appel Advise ou les méthodes qui peuvent montrer la progression d’une opération de longue durée.