Quando si tenta di creare un'istanza di un Windows form, si riceve un'eccezione di System.Threading.ThreadStateException

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 841295
Sintomi
Quando si tenta di creare un'istanza di un modulo di Microsoft Windows che contiene un controllo ActiveX, è che venga visualizzato il seguente messaggio di errore:
Si è verificata un'eccezione non gestita di tipo 'System.Threading.ThreadStateException' in System

Informazioni aggiuntive: Impossibile creare un'istanza non controllo ActiveX "GUID' perché il thread corrente non è presente in un apartment a thread singolo.
NotaGUID è un segnaposto per il GUID del controllo ActiveX.

Nota Questo problema potrebbe verificarsi dopo la prima volta che si esegue l'applicazione.
Cause
Il controllo ActiveX richiede che il thread di creare un'istanza deve essere in un apartment a thread singolo (STA). Il thread di creare un'istanza è il thread che tenta di creare un'istanza di Windows form. Tuttavia, il thread di creare un'istanza è in un apartment con multithreading (MTA). Ciò conduce a una race condition che causa il problema menzionato nella sezione "Sintomi".

Il thread di creare un'istanza può avere un MTA se una delle seguenti condizioni è vera:
  • Nell'applicazione host, utilizzare il MTAThread attributo per specificare che il thread principale viene eseguito in anMTA.
  • Nell'applicazione host, si avvia un nuovo withoutspecifying thread lo stato dell'apartment del thread. In questo caso, il thread viene eseguito inan MTA.
  • Nell'applicazione host, specificare il nuovo thread ofa stato apartment come multithreading prima dell'avvio del thread.
Workaround
Per ovviare a questo problema, assicurarsi che il thread di creazione di un'istanza venga eseguito in sta

Se si utilizza l'attributo MTAThread per specificare che il thread principale dell'applicazione host viene eseguita in MTA, è necessario utilizzare invece l'attributo STAThread . A tale scopo, attenersi alla seguente procedura:
  1. Nel codice dell'applicazione host, individuare il followingcode:
    <MTAThread()> _
  2. Sostituire il codice che trova nel passaggio precedente con il codice seguente:
    <STAThread()> _
  3. Compilare l'applicazione host e quindi eseguire il hostapplication.

    Il problema menzionato nella sectiondoes di "Sintomi" si verifica.
Se si avvia un nuovo thread senza specificare lo stato dell'apartment del thread, è necessario specificare lo stato dell'apartment del thread come thread singolo. A tale scopo, attenersi alla seguente procedura:
  1. Se si avvia un thread denominato MyThread nel codefor dell'applicazione host, individuare il seguente codice:
    MyThread.Start()
  2. Aggiungere il seguente codice prima del codice che trova nel passaggio precedente:
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Compilare l'applicazione host e quindi eseguire il hostapplication.

    Il problema menzionato nella sectiondoes di "Sintomi" si verifica.
Se si specifica lo stato dell'apartment di un nuovo thread di multithreading, prima dell'avvio del thread, è necessario specificare lo stato dell'apartment del thread come thread singolo. A tale scopo, attenersi alla seguente procedura:
  1. Se si specifica lo stato dell'apartment di threadas di MyThread multithreading nel codice dell'applicazione host, individuare il followingcode:
    MyThread.ApartmentState = Threading.ApartmentState.MTA
  2. Sostituire il codice che trova nel passaggio precedente con il codice seguente:
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Compilare l'applicazione host e quindi eseguire il hostapplication.

    Il problema menzionato nella sectiondoes di "Sintomi" si verifica.
Status
Questo è il comportamento previsto.
Informazioni

Procedura per riprodurre il problema

  1. Avviare Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. Utilizzare Microsoft Visual Basic .NET o Microsoft Visual Basic2005 per creare un progetto applicazione Windows.

    Per impostazione predefinita, viene creato il modulo Form1Windows.
  3. Aggiungere qualsiasi controllo ActiveX, ad esempio Browsercontrol Web di Microsoft, al Form1 Windows form.
  4. Se si desidera specificare che il thread principale di hostapplication viene eseguita in MTA, attenersi alla seguente procedura:
    1. Nel file Form1. vb, individuare il seguente codice:
      End Class
    2. Aggiungere il seguente codice prima del codice che trova nel passaggio precedente:
      <MTAThread()> _Public Shared Sub Main()   ' Run a standard application message loop on the current thread.   Application.Run(New Form1())End Sub
    Se si desidera avviare un nuovo thread senza specificare theapartment stato del thread, attenersi alla seguente procedura:
    1. Nel file Form1. vb, individuare il seguente codice:
      End Class
    2. Aggiungere il seguente codice prima del codice che trova nel passaggio precedente:
      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 si desidera specificare lo stato dell'apartment di un nuovo threadas multithreading, prima dell'avvio del thread, attenersi alla seguente procedura:
    1. Nel file Form1. vb, individuare il seguente codice:
      End Class
    2. Aggiungere il seguente codice prima del codice che trova nel passaggio precedente:
      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. Compilare l'applicazione host e quindi eseguire il hostapplication.

    Si verifica il problema menzionato nella sectionmay di "Sintomi".
Riferimenti
Per ulteriori informazioni, visitare i seguenti siti Web Microsoft:

Classe ThreadStateExceptionMetodo Application. Run (modulo)Classe di formControlli ActiveXProcessi e thread apartmentClasse thread Per ulteriori informazioni, fare clic sul numero riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base riportato di seguito:
316422 Guida di orientamento per il threading in Visual Basic .NET

Avviso: questo articolo è stato tradotto automaticamente

속성

문서 ID: 841295 - 마지막 검토: 07/25/2015 12:36:00 - 수정: 3.0

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

  • kbvs2005swept kbvs2005applies kbwindowsforms kbcontrol kbsample kbcode kberrmsg kbthread kbprb kbmt KB841295 KbMtit
피드백