Threading suporte no Office
Este tópico fornece informações sobre como threads é suportado no modelo de objeto do Microsoft Office.O modelo de objeto do Office não tem segurança de segmentos, mas é possível trabalhar com vários segmentos em uma solução do Office.Os aplicativos do Office são servidores do Component Object Model (COM).COM permite que os clientes chamem servidores COM em segmentos arbitrários.Para servidores COM que não tem segurança de segmentos, COM fornece um mecanismo para serializar chamadas simultâneas de modo que somente um segmento lógico é executado no servidor a qualquer momento.Esse mecanismo é conhecido como o modelo de segmentação única de apartment (STA).Porque as chamadas são serializados, os chamadores podem ser bloqueado por períodos de tempo quando o servidor está ocupado ou está tratando outro chama um segmento de plano de fundo.
Aplicáve a: As informações neste tópico se aplicam a projetos em nível de aplicativo e em nível de documento para o Office 2013 e o Office 2010. Consulte Recursos disponíveis pelo aplicativo do Office e o tipo de projeto.
Conhecimento necessário para usar vários segmentos
Para trabalhar com vários segmentos, você deve ter pelo menos o conhecimento básico dos seguintes aspectos de multithreading:
APIs do windows
Conceitos com COM
Concorrência
sincronização
Empacotamento
Para obter informações gerais sobre multithreading, consulte Multithreading em componentes.
Office executa em STA principal.Entender as implicações de isso torna possível entender como usar vários segmentos com o Office.
Situação básica de multithreading
O código em soluções do Office sempre executa no segmento principal de interface do usuário.Você pode desejar alisar para fora o desempenho do aplicativo executando uma tarefa separada em um segmento de plano de fundo.O objetivo é concluir convenientemente imediatamente duas tarefas em vez de uma tarefa seguido por outra, que deve resultar em execução mais suave (o principal motivo para usar vários segmentos.)Por exemplo, você pode ter seu código do evento no segmento principal do excel interface do usuário, e em um thread em segundo plano você pode executar uma tarefa que coleta dados de um servidor e células atualizaria o excel interface do usuário com dados do servidor.
Segmentos de plano de fundo que chamam no Office o modelo de objeto
Quando um segmento de plano faz uma chamada para o aplicativo do Office, a chamada empacotado automaticamente pelo limite STA.Em o entanto, não há nenhuma garantia que o aplicativo do Office pode manipular a chamada no momento que o segmento de plano o faz.há diversas possibilidades:
O aplicativo do Office deve bombear mensagens para que a chamada tem a oportunidade de continuar.Se estiver fazendo o processamento intenso sem produzir esse poderia levar tempo.
Se outro segmento lógico já está no), o novo segmento não pode ancorar.Isso ocorre geralmente quando um segmento lógico inserir o aplicativo do Office e siga um de volta reentrante de chamada para o compartimento do chamador.O aplicativo está bloqueado que espera que se para retornar.
O excel podem estar em um estado para que não podem imediatamente manipular uma chamada de entrada.Por exemplo, o aplicativo do Office pode exibir uma caixa de diálogo modal.
Para as possibilidades 2 e 3, COM o fornece a interface de IMessageFilter .Se o servidor implementa o, todas as chamadas vêm com o método de HandleIncomingCall .Para a possibilidade 2, chamadas são descartados automaticamente.Para a possibilidade 3, o servidor pode descartar a chamada, dependendo das circunstâncias.Se a chamada é descartado, o chamador deve decidir o que fazer.Normalmente, o chamador implementa IMessageFilterem esse caso, será notificado de rejeção pelo método de RetryRejectedCall .
Em o entanto, no caso de soluções criadas usando as ferramentas de desenvolvimento do Office no Visual Studio, interoperabilidade COM converte todas as chamadas descartados a System.Runtime.InteropServices.COMException (“o filtro de mensagem indicou que o aplicativo está ocupado”).Sempre que você faz um modelo de objeto chamar uma thread em segundo plano, você deve estar preparado para tratar essa exceção.Normalmente, isso envolve testar de volta para certa quantidade de tempo e exibir uma caixa de diálogo.Em o entanto, você também pode criar o thread em segundo plano como STA e registra em um filtro de mensagem para aquele segmento para manipular esses casos.
Iniciando o segmento corretamente
Quando você cria um novo segmento STA, defina o estado apartment para STA antes de iniciar o segmento.O exemplo de código a seguir demonstra como fazer isso.
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();
Para obter mais informações, consulte As práticas recomendadas de threads gerenciadas.
Formulários sem janela restrita
Um formulário não permite qualquer tipo de interação com o aplicativo quando 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 de formulários sem janela restrita; Office gerenciaram no entanto, não devem ser usado em um segmento de plano de fundo.