Uma aplicação de consola que se baseia uma STA pode atrasar a publicação de componentes COM e pode atrasar as chamadas para os métodos Finalize dos objectos que recolhe o recolector de lixo

Traduções de Artigos Traduções de Artigos
Artigo: 828988 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Se uma aplicação de consola que se baseia um único-threaded apartment (STA) cria e, em seguida, utiliza componentes STA COM (Component Object Model) e a aplicação de consola não efectua as operações suficientes Bomba mensagens COM, como, por exemplo, chamar o método Monitor.Enter , o método Thread.Join e outros, poderão ocorrer os seguintes sintomas. Além disso, se a aplicação da consola executa as operações que são executados por um longo período de tempo e que não Bomba mensagens, como, por exemplo, chamar o método Console.ReadLine , poderão ocorrer os seguintes sintomas:
  • A publicação de componentes do COM pode ser atrasada.
  • As chamadas para os métodos Finalize dos objectos que recolhe o recolector de lixo podem ser atrasadas.
  • Chamadas para componentes do COM podem bloquear o thread da aplicação durante longos períodos.
  • Pode aumentar a quantidade de memória pelo processo do aplicativo STA ao longo do tempo.
  • Chamadas para o método GC.WaitForPendingFinalizers poderão demorar muito tempo a devolver.

Causa

Para fornecer uma chamada para um componente COM STA correctamente, incluindo uma chamada para libertar o componente, o thread onde foi criado o componente tem de bombeamento mensagens. Quando o código gerido não referencia um componente COM, o thread de finalizadores tem de chamar o método de versão do componente. No entanto, se o thread STA onde foi criado o componente não é bombeamento mensagens, os blocos de chamada a aplicação até que o thread inicia bombeamento mensagens novamente. Algumas aplicações criam muita COM componentes e objectos que podem ser finalizados. Estas aplicações, se o thread de finalizadores despende muito tempo bloqueado enquanto aguarda a STA thread Bomba mensagens, o thread de finalizadores poderá não conseguir concluir a actividade. Ambos da lista de COM componentes para edição e lista de objectos geridos para finalizar poderão aumentar indefinidamente. Se este problema ocorre, poderá aumentar a quantidade de memória pelo processo do aplicativo STA ao longo do tempo. Além disso, qualquer thread que chama o método GC.WaitForPendingFinalizers pode bloquear indefinidamente.

As operações de (es) de entrada/saída de ficheiro e a consola do sistema operativo, tais como ReadFile e WriteFile , não Bomba mensagens. Porque Console.ReadLine depende da API de ReadFile do sistema operativo, Console.ReadLine é ou não Bomba mensagens. Assim, qualquer thread que chama Console.ReadLine não Bomba mensagens durante a chamada.

Resolução

Para resolver este problema, utilize MTA threads em vez de threads STA para criar e comunicar com componentes COM em aplicações da consola. Pode definir o thread principal da aplicação a um MTA. Para efectuar este procedimento, aplicar System.MTAThread atributo para o método principal, da seguinte forma: classe pública
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
se deve utilizar threads STA para criar componentes COM, os threads STA tem Bomba mensagens regularmente. Bomba mensagens para um curto período de tempo, chamar o método Thread.Join , da seguinte forma:
Thread.CurrentThread.Join(100)
esta chamada de método pumps mensagens de 100 milisegundos. Pode ajustar o limite de tempo com base nos requisitos da aplicação. Além disso, a STA thread nunca deve executar operações de bombeamento não ligadas, tais como chamar Console.ReadLine . Em vez disso, o thread STA tem de ter um thread MTA executar a operação e aguarde que a operação terminar.

Referências


Para obter mais informações sobre o sistema de interacção remota Microsoft .NET Framework, visite o seguinte Web site da Microsoft:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Para obter mais informações sobre a recolha de dados no .NET Framework, visite os seguintes Web sites da Microsoft:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Para obter informações adicionais sobre como bloquear as chamadas a partir de um componente STA, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
291837INFO: Não efectuar chamadas de bloqueios de um componente STA

Propriedades

Artigo: 828988 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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