Compartilhar via


Threading no MAPI

Aplica-se a: Outlook 2013 | Outlook 2016

Um thread é a entidade básica para a qual um sistema operacional aloca o tempo da CPU. Um thread tem seus próprios registros, pilha, prioridade e armazenamento, mas compartilha um espaço de endereço e processa recursos como tokens de acesso. Os threads também compartilham memória, com um thread lendo o que outro thread escreveu.

Os clientes MAPI usam os seguintes modelos genéricos de threading.

Modelo de threading Descrição
Modelo de threading único
Todos os objetos são usados no thread único.
Modelo de threading de apartamento
Um objeto só pode ser usado no thread que o criou.
Threading gratuito ou thread-party, modelo
Um objeto pode ser usado em qualquer thread.

O MAPI usa o modelo de threading gratuito, com suporte a objetos thread-safe que podem ser usados em qualquer thread a qualquer momento. O OLE usa o modelo de threading de apartamento. O modelo de threading de apartamento dá suporte a objetos que devem ser transferidos explicitamente quando um thread diferente daquele que criou o objeto precisa usar esse objeto.

O mecanismo que o OLE usa para transferir objetos de um thread para outro é conhecido como marshaling. O marshaling envolve um objeto stub e um objeto proxy. Esses objetos especiais empacotam os parâmetros da interface no objeto a ser empacotado, transferem esses parâmetros para o outro thread e os descompactam na chegada. O conflito entre os dois modelos multithreads surge quando um objeto MAPI de threading livre é enviado para outro processo usando a Chamada de Procedimento Remoto "leve" do OLE ou LRPC. O LRPC altera a semântica do objeto de threading gratuito para threading de apartamento interpondo interfaces stub e proxy com o comportamento de threading de apartamento entre o objeto e seu chamador. A conscientização sobre as situações no MAPI que levam a esse conflito pode ajudar clientes e provedores de serviços a evitar que problemas ocorram.

Um objeto MAPI pode ser acessado:

  • Por meio de chamadas diretas para seus métodos usando um ponteiro de interface retornado por um provedor de serviços ou MAPI vinculado ao processo do cliente, como o objeto de sessão retornado do MAPILogonEx.

  • Por meio de chamadas indiretas para seus métodos usando um ponteiro de interface retornado por qualquer provedor de serviços, como o objeto de pasta copiado de outra pasta em IMAPIFolder::CopyFolder.

  • Por meio de uma função de retorno de chamada, como o método IMAPIAdviseSink::OnNotify passado para um provedor de serviços ou para MAPI em uma chamada de aconselhamento ou os métodos que podem mostrar progresso em uma operação longa.