Beim Erstellen einer Instanz eines Windows Forms, erhalten eine System.Threading.ThreadStateException-Ausnahme


Problembeschreibung


Beim Erstellen einer Instanz eines Microsoft Windows Form, das ein ActiveX-Steuerelement enthält, erhalten Sie folgende Fehlermeldung:
Eine nicht behandelte Ausnahme des Typs 'System.Threading.ThreadStateException' ist in system.windows.forms.dll Zusatzinformationen aufgetreten: ActiveX-Steuerelement "GUID" konnte nicht instanziiert werden, da der aktuelle Thread nicht in einem Singlethread-Apartment ist.
HinweisGUID ist ein Platzhalter für die GUID des ActiveX-Steuerelements. Hinweis Dieses Problem kann nicht nach dem ersten auftreten, die Ihre Anwendung ausführen.

Ursache


Das ActiveX-Steuerelement muss Instanziierung Thread in einem Singlethread-Apartment (STA) werden muss. Der Instanziierung Thread ist der Thread, der versucht, eine Instanz des Windows Form erstellen. Jedoch würde Threads in einem Multithread-Apartment (MTA). Dies führt zu einer Racebedingung das Problem verursacht, das im Abschnitt "Symptome" genannt wird. Der Instanziierung Thread kann ein MTA, wenn Folgendes zutrifft:
  • In der hostanwendung verwenden Sie das MTAThread -Attribut angeben, dass der Hauptthread in einem MTA ausgeführt wird.
  • In der Host-Anwendung starten Sie einen neuen Thread ohne den Apartmentzustand des Threads. In diesem Fall führt der Thread in einem MTA.
  • Der Host-Anwendung geben Sie den Apartmentzustand eines neuen Threads als Multithread vor dem Starten des Threads.

Problemumgehung


Um dieses Problem zu umgehen, stellen Sie sicher, dass Instanziierung STA Faden. Verwenden Sie das MTAThread -Attribut angeben, dass der Hauptthread der Host-Anwendung in einem MTA ausgeführt wird, verwenden Sie stattdessen das Attribut STAThread . Gehen Sie hierzu folgendermaßen vor:
  1. Suchen Sie im Code Ihrer Anwendung den folgenden Code:
    <MTAThread()> _
  2. Ersetzen Sie den Code, den Sie im vorherigen Schritt ermittelt haben, mit dem folgenden Code :
    <STAThread()> _
  3. Erstellen Sie die Hostanwendung, und führen Sie dann die Hostanwendung aus. Das im Abschnitt "Problembeschreibung" erwähnte Problem tritt nicht auf.
Wenn Sie einen neuen Thread starten, ohne den Apartmentzustand des Threads, müssen Sie den Apartmentzustand des Threads als Singlethread-angeben. Gehen Sie hierzu folgendermaßen vor:
  1. Wenn Sie einen Thread MyThread im Code für die hostanwendung mit dem Namen starten, suchen Sie den folgenden Code:
    MyThread.Start()
  2. Fügen Sie folgenden Code vor dem Code ein, den Sie im vorherigen Schritt ermittelt haben:
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Erstellen Sie die Hostanwendung, und führen Sie dann die Hostanwendung aus. Das im Abschnitt "Problembeschreibung" erwähnte Problem tritt nicht auf.
Bei den Apartmentzustand eines neuen Threads als Multithread Angabe vor dem Starten des Threads müssen Sie stattdessen den Apartmentzustand des Threads als Singlethread-angeben. Gehen Sie hierzu folgendermaßen vor:
  1. Wenn Sie den Apartmentzustand des Threads MyThread als Multithread im Code für die hostanwendung angeben, suchen Sie den folgenden Code:
    MyThread.ApartmentState = Threading.ApartmentState.MTA
  2. Ersetzen Sie den Code, den Sie im vorherigen Schritt ermittelt haben, mit dem folgenden Code :
    ' Specify that the MyThread thread runs in an STA.MyThread.ApartmentState = Threading.ApartmentState.STA
  3. Erstellen Sie die Hostanwendung, und führen Sie dann die Hostanwendung aus. Das im Abschnitt "Problembeschreibung" erwähnte Problem tritt nicht auf.

Status


Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen


Schritte zum Reproduzieren des Problems

  1. Starten Sie Microsoft Visual Studio .NET oder Microsoft Visual Studio 2005.
  2. Verwenden Sie Microsoft Visual Basic .NET oder Microsoft Visual Basic 2005 ein Windows-Anwendungsprojekt erstellen. Standardmäßig wird Form1 Windows Form erstellt.
  3. Jedes ActiveX-Steuerelement, wie das Microsoft Webbrowser-Steuerelement auf das Form1 Windows Form hinzufügen
  4. Gehen folgendermaßen Sie vor, um anzugeben, dass der Hauptthread in der hostanwendung in einem MTA ausgeführt wird:
    1. Suchen Sie den folgenden Code in der Datei Form1.vb:
      End Class
    2. Fügen Sie folgenden Code vor dem Code ein, den Sie im vorherigen Schritt ermittelt haben:
      <MTAThread()> _Public Shared Sub Main()   ' Run a standard application message loop on the current thread.   Application.Run(New Form1())End Sub
    Gehen folgendermaßen Sie vor, um einen neuen Thread starten, ohne den Apartmentzustand des Threads:
    1. Suchen Sie den folgenden Code in der Datei Form1.vb:
      End Class
    2. Fügen Sie folgenden Code vor dem Code ein, den Sie im vorherigen Schritt ermittelt haben:
      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
    Möchten Sie den Apartmentzustand eines neuen Threads als Multithread angeben, bevor der Thread gestartet wird, gehen Sie folgendermaßen vor:
    1. Suchen Sie den folgenden Code in der Datei Form1.vb:
      End Class
    2. Fügen Sie folgenden Code vor dem Code ein, den Sie im vorherigen Schritt ermittelt haben:
      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. Erstellen Sie die Hostanwendung, und führen Sie dann die Hostanwendung aus. Das im Abschnitt "Symptome" erwähnte Problem auftreten.

Informationsquellen


Weitere Informationen finden Sie im Microsoft Websites: ThreadStateException-KlasseMethode Application.Run (Formular)Form-KlasseActiveX-SteuerelementeProzesse und Threads apartmentsThread-KlasseKlicken Sie für Weitere Informationen auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
316422 -Roadmap für threading in Visual Basic .NET