Você receber uma exceção System.Threading.ThreadStateException quando você tenta criar uma instância de um formulário do Windows

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: 841295
Sintomas
Quando você tenta criar uma instância do Microsoft Windows formulário que contém um controle ActiveX, a seguinte mensagem de erro:
Uma exceção sem tratamento do tipo 'System.Threading.ThreadStateException' ocorreu em system.windows.forms.dll

Obter informações adicionais: não foi possível instanciar o controle ActiveX ' GUID ' porque o thread atual não está em um single-threaded apartment.
Observação GUID é um espaço reservado para o GUID do controle ActiveX.

Observação Esse problema pode não ocorrer após a primeira vez que você executar seu aplicativo.
Causa
O controle ActiveX requer que o thread instanciando deve estar em um single-threaded apartment (STA). O thread instanciando é o thread que tenta criar uma instância de formulário do Windows. No entanto, o thread instanciando está em um compartimento com vários segmentos (MTA). Isso leva a uma condição de corrida que faz com que o problema mencionado na "Sintomas" seção.

O thread instanciando pode estar em um MTA se uma das seguintes condições for verdadeira:
  • No aplicativo host, você usar o atributo MTAThread para especificar que o thread principal é executado em um MTA.
  • No aplicativo host, você pode iniciar um novo thread sem especificar o estado de apartment do segmento. Nesse caso, o thread é executado em um MTA.
  • No aplicativo host, você especifica o estado de apartment de um novo thread como multissegmentados antes que o thread seja iniciado.
Como Contornar
Para contornar este problema, certifique-se que o segmento instanciando é executado em um STA.

Se você usar o atributo MTAThread para especificar que o thread principal do aplicativo host é executado em um MTA, você deve usar o atributo STAThread . Para fazer isso, execute as seguintes etapas:
  1. No código para o aplicativo host, localize o código a seguir:
    <MTAThread()> _
  2. Substitua o código localizado na etapa anterior com o seguinte código:
    <STAThread()> _
  3. Criar seu aplicativo de host e executar o aplicativo host.

    O problema mencionado na seção "Sintomas" não ocorre.
Se você iniciar um novo thread sem especificar o estado do segmento de apartamento, você deve especificar o estado de apartment do thread como single-threaded. Para fazer isso, execute as seguintes etapas:
  1. Se você iniciar um thread é denominado MyThread no código para o aplicativo host, localize o código a seguir:
    MyThread.Start()
  2. Adicione o seguinte código antes do código que você localizado na etapa anterior:
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Criar seu aplicativo de host e executar o aplicativo host.

    O problema mencionado na seção "Sintomas" não ocorre.
Se você especificar estado de um novo thread apartment como multissegmentados antes que o thread seja iniciado, você deve especificar o estado de apartment do thread como single-threaded em vez disso. Para fazer isso, execute as seguintes etapas:
  1. Se você especificar o estado de thread MyThread apartment como multithread no código para seu aplicativo host, localize o código a seguir:
    MyThread.ApartmentState = Threading.ApartmentState.MTA
  2. Substitua o código localizado na etapa anterior com o seguinte código:
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Criar seu aplicativo de host e executar o aplicativo host.

    O problema mencionado na seção "Sintomas" não ocorre.
Situação
Esse comportamento é por design.
Mais Informações

Etapas para reproduzir o problema

  1. Inicie Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Use o Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 para criar um projeto Windows Application.

    Por padrão, o Form1 é criado o formulário do Windows.
  3. Adicionar qualquer controle ActiveX, como o Microsoft Web Browser controle, ao formulário do Windows Form1.
  4. Se você quiser especificar que o thread principal no aplicativo host é executado em um MTA, execute estas etapas:
    1. No arquivo Form1.vb, localize o código a seguir:
      End Class
    2. Adicione o seguinte código antes do código que você localizado na etapa anterior: _
      <MTAThread()> _Public Shared Sub Main()   ' Run a standard application message loop on the current thread.   Application.Run(New Form1())End Sub
    Se você deseja iniciar um novo thread sem especificar o estado do segmento de apartamento, siga estas etapas:
    1. No arquivo Form1.vb, localize o código a seguir:
      End Class
    2. Adicione o seguinte código antes do código que você localizado na etapa anterior:
      Public Shared Sub Main()   ' Create a thread. Then run the LaunchForm method on the thread.   ' This automatically runs the main thread in the application in an MTA.   Dim MyThread As System.Threading.Thread	   MyThread = New System.Threading.Thread(AddressOf LaunchForm)   MyThread.Start()End SubPublic Shared Sub LaunchForm()   ' Run a standard application message loop on the current thread.   Application.Run(New Form1())End Sub
    Se você deseja especificar o estado de um novo thread apartment como multithread antes que o thread seja iniciado, siga estas etapas:
    1. No arquivo Form1.vb, localize o código a seguir:
      End Class
    2. Adicione o seguinte código antes do código que você localizado na etapa anterior:
      Public Shared Sub Main()   ' Create a thread. Then run the LaunchForm method on the thread.   Dim MyThread As System.Threading.Thread   MyThread = New System.Threading.Thread(AddressOf LaunchForm)   ' Specify that the MyThread thread runs in an MTA.   MyThread.ApartmentState = Threading.ApartmentState.MTA   MyThread.Start()End SubPublic Shared Sub LaunchForm()   ' Run a standard application message loop on the current thread.   Application.Run(New Form1())End Sub
  5. Criar seu aplicativo de host e executar o aplicativo host.

    O problema mencionado na seção "Sintomas" pode ocorrer.
Referências
Para informações adicionais, visite os seguintes sites:

Classe ThreadStateExceptionMétodo Application.Run (formulário)Classe de formulárioControles ActiveXProcessos, segmentos e compartimentosClasse de threadPara obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
316422Mapa para threading no Visual Basic .NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 841295 - Última Revisão: 11/16/2007 09:13:27 - Revisão: 2.9

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbwindowsforms kbcontrol kbsample kbcode kberrmsg kbthread kbprb KB841295 KbMtpt
Comentários