Share via


Segmentação suporte no Office

Este tópico fornece informações sobre como threading é suportado no modelo de objeto do Microsoft Office.O modelo de objeto do Office não é thread-safe, mas é possível trabalhar com Múltiplo segmentos em uma solução do Office.Aplicativos do Office são servidores de (componente Objeto Model).COM permite que os clientes chamar servidores COM em threads arbitrários.Para servidores COM que não são thread-safe, COM fornece um mecanismo para serializar chamadas simultâneas para que apenas um thread lógico seja executado no servidor a a a qualquer hora.Esse mecanismo é conhecido como o modelo Simples-threaded apartment (STA).Porque as chamadas são serializadas, chamadores poderá ser bloqueados por períodos de tempo enquanto o servidor está ocupado ou está manipulando Outro chamadas em um thread de Plano de Fundo.

Dados de conhecimento necessário ao usar Múltiplo segmentos

Para trabalhar com Múltiplo segmentos, você deve ter conhecimento menos Basic sobre o os seguintes aspectos de multithreading:

  • APIs do Windows

  • COM conceitos multithread

  • Concorrência

  • Sincronização

  • Empacotamento

Para Geral informações sobre consulte multithreading, Multithreading in Components.

O Office é executado na STA. principalNoções básicas sobre as implicações de isso torna possível entender como usar Múltiplo segmentos com o Office.

Cenário de multithreading Basic

Ferramentas do Visual Studio para o Office código sempre é executado no thread da interface do usuário principal.Talvez seja conveniente suavizar fora do desempenho do aplicativo executando uma tarefa separada em um thread de Plano de Fundo.O objetivo é concluir duas tarefas aparentemente ao mesmo tempo, em vez de uma tarefa seguida por outro, que deve resultar em execução suave (a principal razão para usar Múltiplo segmentos).Por exemplo, você pode ter seu código de evento no thread principal interface de usuário do Excel, e em um thread de Plano de Fundo, você pode executar uma tarefa que coleta dados de um servidor e atualiza a células em que a interface do usuário do Excel com os dados do servidor.

Threads de plano de fundo que a chamada para o modelo de objeto do Office

Quando um thread de Plano de Fundo faz uma chamada para o aplicativo do Office, a chamada é empacotada automaticamente no limite de STA.No entanto, não há nenhuma garantia de que o aplicativo do Office pode manipular a chamada no momento que o thread de Plano de Fundo torna.Existem várias possibilidades:

  1. O aplicativo do Office deve bombardeia mensagens para a chamada terá a oportunidade de Enter.Se ele está fazendo ativado processamento sem produzindo isso pode levar tempo.

  2. Se outro thread lógico já estiver no compartimento, o novo segmento não é possível Enter.Isso geralmente acontece quando um thread lógico insere o aplicativo do Office e, em seguida, faz uma chamada reentrante Voltar para compartimento do chamador.O aplicativo está bloqueado aguardando a chamada retornar.

  3. O Excel pode estar em um estado de modo que ele não pode tratar imediatamente uma chamada de entrada.Por exemplo, o aplicativo do Office pode estar exibindo uma caixa de diálogo modal.

Para possibilidades 2 e 3, COM fornece uma interface chamada IMessageFilter.Se o servidor implementa, todas as chamadas Enter através um método chamado HandleIncomingCall.Possibilidade de 2, chamadas automaticamente são rejeitadas.Possibilidade de 3, o servidor pode rejeitar a chamada, dependendo das circunstâncias.Se a chamada será rejeitada, o chamador deve decidir o que fazer.Normalmente, o chamador implementa IMessageFilter, nesse maiúscminúsc ele poderia ser notificado da rejeição pelo método RetryRejectedCall.

No entanto, no maiúscminúsc Ferramentas do Visual Studio para o Office , interoperabilidade COM converte rejeitadas todas as chamadas para um System.Runtime.InteropServices.COMException ("o filtro de Mensagemens indicou que o aplicativo está ocupado").Sempre que você tornar um modelo de objeto chamada em um thread de Plano de Fundo, você deve para estar preparado para lidar com essa exceção.Normalmente, que envolve a repetição durante um determinado período de tempo e, em seguida, exibindo uma caixa de diálogo.No entanto, você também pode criar o Thread de plano de fundo como STA e, em seguida, registre um filtro de mensagem para esse Thread lidar com isso maiúscminúsc.

Iniciar o thread corretamente

Quando você Criar um novo thread STA, defina o estado apartment como STA antes de iniciar o thread:

Dim t As New System.Threading.Thread(AddressOf AnObject.aMethod)

t.SetApartmentState(System.Threading.ApartmentState.STA)
t.Start()
System.Threading.Thread t = new System.Threading.Thread(AnObject.aMethod);

t.SetApartmentState(System.Threading.ApartmentState.STA);
t.Start();

For more information, see Gerenciado Threading práticas recomendadas .

Formulários sem janela restrita

Um formulário sem janela restrita permite algum tipo de interação com o aplicativo enquanto o formulário é exibido.O usuário interage com o formulário, e o formulário interage com o aplicativo sem fechar.O modelo de objeto do Office oferece suporte a formulários sem janela restrita gerenciados; no entanto, elas não devem ser usadas em um thread de Plano de Fundo.

Consulte também

Conceitos

Criar soluções do Office no Visual Studio

Referência

Segmentação (guia de programação C#)

Outros recursos

Multithreading in Components

Threads gerenciadas

Multisegmentação no Visual Basic

Usando segmentos e Threading