Compartilhar via


Threading suporte no Office

Este tópico fornece informações sobre como threading é suportado no modelo de objeto Microsoft Office. O modelo de objeto do Office não é thread-safe, mas é possível trabalhar com vários segmentos em uma solução do Office. Aplicativos do Office são servidores de modelo de objeto componente (COM). 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, de modo que apenas um thread lógico é executado no servidor a qualquer momento. Esse mecanismo é conhecido como o modelo single-threaded apartment (STA). Porque as chamadas são serializadas, os chamadores podem ser bloqueados por períodos de tempo, enquanto o servidor está ocupado ou manipulação de outras chamadas em um segmento de plano de fundo.

Aplicável a: As informações neste tópico se aplicam a projetos de nível de documento e projetos de nível de aplicativo para Microsoft Office 2010 e o sistema 2007 do Microsoft Office. Para obter mais informações, consulte Recursos disponíveis pelo aplicativo do Office e o tipo de projeto.

Dados de conhecimento necessários ao utilizar vários Threads

Para trabalhar com vários segmentos, você deve ter conhecimento básico de pelo menos os seguintes aspectos de multithreading:

  • APIs do Windows

  • COM os conceitos multithread

  • Simultaneidade

  • Synchronization

  • Empacotamento

Para obter informações gerais sobre consulte multithreading, Multithreading em componentes.

Office é executado em STA. principal Noções básicas sobre as implicações disso se torna possível entender como usar vários segmentos com o Office.

Cenário de Multithreading básico

O código em soluções do Office é sempre executado no thread da interface do usuário principal. Convém para suavizar o desempenho de aplicativos executando uma tarefa separada em um segmento de plano de fundo. O objetivo é concluir duas tarefas aparentemente ao mesmo tempo, em vez de uma tarefa seguida de outro, que deve resultar na execução de mais suave (o principal motivo para usar vários segmentos). Por exemplo, você pode ter seu código de evento no thread principal da interface do usuário do Excel e, em um segmento de plano de fundo, você pode executar uma tarefa que reúne dados de um servidor e atualiza as células na interface de usuário do Excel com os dados do servidor.

Threads de segundo plano que chamar o modelo de objeto do Office

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

  1. O aplicativo do Office deve bomba de mensagens para a chamada terá a oportunidade de inserir. Se ele está fazendo pesadas de processamento sem produzindo isso podem levar tempo.

  2. Se outro thread lógico já esteja no apartamento, não é possível inserir o novo segmento. Isso geralmente acontece quando um segmento lógico entra o aplicativo do Office e, em seguida, faz uma chamada reentrante apartment do chamador. O aplicativo está bloqueado aguardando a chamada a retornar.

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

Possibilidades de 2 e 3, COM fornece a IMessageFilter interface. Se o servidor implementa, todas as chamadas digite através do HandleIncomingCall método. Possibilidade de 2, chamadas automaticamente são rejeitadas. Possibilidade de 3, o servidor pode rejeitar a chamada, dependendo das circunstâncias. Se a chamada for rejeitada, o chamador deve decidir o que fazer. Normalmente, a implementa o chamador IMessageFilter, caso em que seria notificado da rejeição pela RetryRejectedCall método.

No entanto, no caso de soluções criadas usando as ferramentas de desenvolvimento do Office em Visual Studio, a interoperabilidade COM converte rejeitadas todas as chamadas para um System.Runtime.InteropServices.COMException ("O filtro de mensagens indicou que o aplicativo está ocupado"). Sempre que você fizer um modelo de objeto de chamada em um segmento de plano de fundo, você deve estar preparado para lidar com essa exceção. Normalmente, que envolve repetindo para um determinado período de tempo e, em seguida, exibindo uma caixa de diálogo. No entanto, pode também criar thread de segundo plano como STA e, em seguida, registre um filtro de mensagem para esse thread para lidar com esse caso.

Iniciar o Thread corretamente

Quando você cria um novo thread STA, defina o estado de apartamento 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();

For more information, see Práticas recomendadas de threads gerenciadas.

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 fechamento. O modelo de objeto do Office oferece suporte a formulários de janela restrita gerenciados; No entanto, eles não devem ser usados em um segmento de plano de fundo.

Consulte também

Conceitos

Threading (C# e Visual Basic)

Outros recursos

Multithreading em componentes

Threads gerenciadas

Multithreading in Visual Basic

Usando segmentos e Threading

Projetando e criando soluções do Office