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

Traduções deste artigo Traduções deste artigo
ID do artigo: 828988 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

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:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Para obter mais informações sobre coleta de lixo no .NET Framework, visite os seguintes sites:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

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

Propriedades

ID do artigo: 828988 - Última revisão: segunda-feira, 9 de fevereiro de 2004 - Revisão: 1.4
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Palavras-chave: 
kbmt kbgarbagecollect kbremoting kbprb KB828988 KbMtpt
Tradução automática
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

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com