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.