Um aplicativo de console que se baseia em um STA pode atrasar a versão de componentes COM e pode atrasar as chamadas para os métodos Finalize dos objetos que coleta o coletor de lixo

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 828988
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Se um aplicativo de console que se baseia em um single-threaded apartment (STA) cria e, em seguida, usa componentes STA COM (Component Object Model) e o aplicativo de console não executa operações suficientes para bomba COM mensagens, tais como chamar o método de Monitor.ENTER , o método Thread.Join e outros, os seguintes sintomas podem ocorrer. Além disso, se o aplicativo de console executa operações que executados por um longo tempo e que não bomba mensagens, como chamar o método console.ReadLine , os seguintes sintomas podem ocorrer:
  • A versão de componentes do COM pode ser atrasada.
  • As chamadas para os métodos Finalize dos objetos que coleta o coletor de lixo podem ser atrasadas.
  • Chamadas de componentes COM podem bloquear o thread de aplicativo por períodos prolongados.
  • A quantidade de memória que o processo de aplicativo STA usa pode aumentar o tempo.
  • Chamadas ao método GC.WaitForPendingFinalizers podem levar muito tempo para retornar.
Causa
Para fornecer uma chamada para um componente COM STA corretamente, incluindo uma chamada para liberar o componente, o thread no qual o componente foi criado deve ser bombeamento mensagens. Quando o código gerenciado não faz referência a um componente COM, o thread do finalizador deve chamar o método versão do componente. No entanto, se o thread STA onde o componente foi criado não é bombeamento de mensagens, os blocos de chamada o aplicativo até que o thread inicia bombeamento de mensagens novamente. Alguns aplicativos criam muita de componentes COM e objetos que podem ser finalizados. Nesses aplicativos, se o thread do finalizador gasta muito tempo bloqueado enquanto aguarda a STA thread a bomba de mensagens, o thread do finalizador não conseguirá concluir sua atividade. Tanto a lista de COM componentes para lançamento e a lista de objetos gerenciados para finalizar podem aumentar indefinidamente. Se esse problema ocorre, poderá aumentar a quantidade de memória que o processo de aplicativo STA usa longo do tempo. Além disso, qualquer segmento que chama o método GC.WaitForPendingFinalizers pode bloquear indefinidamente.

As operações de (E/S) de entrada/saída de arquivo e console do sistema operacional, como ReadFile e WriteFile , não bomba de mensagens. Como console.ReadLine depende a API ReadFile do sistema operacional, console.ReadLine faz ou não bomba de mensagens. Portanto, qualquer segmento que chama console.ReadLine não bomba mensagens durante a chamada.
Resolução
Para resolver esse problema, use threads MTA em vez de segmentos do STA para criar e para se comunicar com componentes COM em aplicativos de console. Você pode definir o thread principal do aplicativo para um MTA. Para fazer isso, aplique System.MTAThread atributo para o método principal, da seguinte maneira:
public class ConsoleApplication             {                 [MTAThread]                 static void Main()                 {                     // Add your code here.                     Console.ReadLine();                 }} 
se você deve usar threads STA para criar componentes COM, os segmentos do STA devem bomba mensagens regularmente. A bomba de mensagens por um curto período de tempo, chame o método Thread.Join , da seguinte maneira:
Thread.CurrentThread.Join(100)
chamada do método bombeia mensagens para 100 milissegundos. Você pode ajustar o tempo limite com base nos requisitos do aplicativo. Além disso, a STA thread nunca deve executar operações acopladas não bombeamento, como chamar console.ReadLine . Em vez disso, o thread STA deve ter um thread MTA executar a operação e, em seguida, aguarde a operação seja concluída.
Referências

Para obter mais informações sobre o Microsoft .NET Framework remoting, visite o seguinte site:Para obter mais informações sobre coleta de lixo no .NET Framework, visite os seguintes sites:
Para obter informações adicionais sobre bloqueio de chamadas de um componente STA, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
291837INFO: Não fazer chamadas de bloqueio de um componente STA
GC, vazamento de memória, host

Propriedades

ID do Artigo: 828988 - Última Revisão: 12/08/2015 04:48:09 - Revisão: 1.4

Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtpt
Comentários