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 de CPU. Um encadeamento tem seus próprios registros, pilha, prioridade e armazenamento, mas compartilha um espaço de endereço e recursos de processo, 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 modelos de threading genéricos a seguir.

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

O MAPI usa o modelo de threading livre, dando 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 usado pelo OLE 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 desempacotam na chegada. O conflito entre os dois modelos multithread surge quando um objeto MAPI de thread livre é enviado para outro processo usando a Chamada de Procedimento Remoto "leve" OLE ou LRPC. O LRPC altera a semântica do objeto de threading livre para threading de apartamento interpondo interfaces de stub e proxy com comportamento de threading de apartamento entre o objeto e seu chamador. O conhecimento das situações no MAPI que levam a esse conflito pode ajudar clientes e provedores de serviços a evitar a ocorrência de problemas.

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 Advise ou os métodos que podem mostrar o progresso em uma operação demorada.