症状当您尝试创建 Microsoft Windows 的实例包含一个 ActiveX 控件的窗体您可能会收到以下错误消息: 类型 System.threading....
当您尝试创建 Microsoft Windows 的实例包含一个 ActiveX 控件的窗体您可能会收到以下错误消息:
类型 System.threading.ThreadStateException 出现 System.Windows.Forms.dll 的未处理的异常
其他信息: 无法实例 ActiveX 控件 GUID 化因为当前线程不在单线程单元。
请注意 GUID 是 ActiveX 控件的 GUID 的占位符。
请注意 运行应用程序的第一个时间之后可能不会发生此问题。
原因ActiveX 控件要求在初始化的线程必须可在单线程单元 (STA) 中。 在初始化线程是试图创建 Windows 窗体的实例的线程。 但是,初始化线程是多线程...ActiveX 控件要求在初始化的线程必须可在单线程单元 (STA) 中。 在初始化线程是试图创建 Windows 窗体的实例的线程。 但是,初始化线程是多线程单元 (MTA)。 这将导致争用条件导致"症状"中提到的问题部分。
如果下列条件之一,就在初始化的线程可以在 MTA 中:
在宿主应用程序中,您使用 MTAThread 属性以指定主线程运行的 MTA 中。
在宿主应用程序中您可以启动新线程未指定线程的单元状态。 在这种情况下,线程运行的 MTA 中。
在宿主应用程序中指定新的线程的单元状态作为多线程在启动线程之前。
替代方法要变通解决此问题,确保初始化的线程运行在一个 STA。如果您使用 MTAThread 属性指定宿主应用程序的主线程运行的 MTA 中,您必须而使用 STAThr...要变通解决此问题,确保初始化的线程运行在一个 STA。
如果您使用 MTAThread 属性指定宿主应用程序的主线程运行的 MTA 中,您必须而使用 STAThread 属性。 要这样做,请按下列步骤操作:
该代码宿主应用程序中找到以下代码:
<MTAThread()> _
将在使用下面的代码在上一步中找到的代码:
<STAThread()> _
生成宿主应用程序,并运行宿主应用程序。
不会出现"症状"一节中提到的问题。
如果未指定线程的单元状态启动新线程,您必须为单线程指定线程的单元状态。 要这样做,请按下列步骤操作:
如果您启动名为 MyThread 代码中的宿主应用程序的线程,找到以下代码:
MyThread.Start()
添加以下代码在上一步中找到的代码之前:
' Specify that the MyThread thread runs in an STA.
MyThread.ApartmentState = Threading.ApartmentState.STA
MyThread.ApartmentState = Threading.ApartmentState.STA
生成宿主应用程序,并运行宿主应用程序。
不会出现"症状"一节中提到的问题。
如果在启动线程之前指定为多线程的新线程的单元状态您必须而为单线程指定线程的单元状态。 要这样做,请按下列步骤操作:
如果为宿主应用程序,为多线程代码中指定 MyThread 线程的单元状态,找到以下代码:
MyThread.ApartmentState = Threading.ApartmentState.MTA
将在使用下面的代码在上一步中找到的代码:
' Specify that the MyThread thread runs in an STA.
MyThread.ApartmentState = Threading.ApartmentState.STA
MyThread.ApartmentState = Threading.ApartmentState.STA
生成宿主应用程序,并运行宿主应用程序。
不会出现"症状"一节中提到的问题。
状态这种现象是设计使然。这种现象是设计使然。
更多信息重现此问题的步骤 启动 Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005。 使用 Micro...重现此问题的步骤
启动 Microsoft Visual Studio.NET 或 Microsoft Visual Studio 2005。
使用 Microsoft Visual Basic.NET 或 Microsoft Visual Basic 2005 创建 Windows 应用程序项目。
默认,Form 1 创建 Windows 窗体。
添加任何 ActiveX 控件 (如) Microsoft Web 浏览器要 Form 1 的 Windows 窗体的控件。
如果要指定主线程在宿主应用程序中的运行的 MTA 中,请按照下列步骤操作:
在 Form 1.vb 文件中找到以下代码:
End Class
添加以下代码在上一步中找到的代码之前:
<MTAThread()> _
Public Shared Sub Main()
' Run a standard application message loop on the current thread.
Application.Run(New Form1())
End Sub
如果要不指定线程的单元状态中启动一个新线程,请按照下列步骤:
在 Form 1.vb 文件中找到以下代码:
End Class
添加以下代码在上一步中找到的代码之前:
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 Sub
Public Shared Sub LaunchForm()
' Run a standard application message loop on the current thread.
Application.Run(New Form1())
End Sub
Application.Run (New Form1()) End Sub
如果要为多线程指定新的线程的单元状态,在启动线程之前,请按照下列步骤:
在 Form 1.vb 文件中找到以下代码:
End Class
添加以下代码在上一步中找到的代码之前:
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 Sub
Public Shared Sub LaunchForm()
' Run a standard application message loop on the current thread.
Application.Run(New Form1())
End Sub
Application.Run (New Form1()) End Sub
生成宿主应用程序,并运行宿主应用程序。
可能会出现"症状"一节中提到的该问题。
参考有关其他信息,请访问下面的 Microsoft Web 站点:ThreadStateException 类 http://msdn2.microsoft.com/...有关其他信息,请访问下面的 Microsoft Web 站点:
ThreadStateException 类
http://msdn2.microsoft.com/en-us/library/system.threading.threadstateexception(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.threading.threadstateexception(vs.71).aspx)
Application.Run 方法 (窗体)
http://msdn2.microsoft.com/en-us/library/Aa334771(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/Aa334771(VS.71).aspx)
窗体类
http://msdn2.microsoft.com/en-us/library/system.windows.forms.form(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.form(vs.71).aspx)
ActiveX 控件
http://msdn2.microsoft.com/en-us/library/Aa751968.aspx (http://msdn2.microsoft.com/en-us/library/Aa751968.aspx)
进程、 线程和单元
http://msdn2.microsoft.com/en-us/library/ms693344.aspx (http://msdn2.microsoft.com/en-us/library/ms693344.aspx)
Thread 类
http://msdn2.microsoft.com/en-us/library/system.threading.thread(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.threading.thread(vs.71).aspx)
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应:
316422 (http://support.microsoft.com/kb/316422/ ) 在 Visual Basic.NET 中的线程的指南
--------------------------------------------------------------------------------
这篇文章中的信息适用于:
Microsoft Visual Basic 2005
Microsoft Visual Basic .NET 2003 标准版
Microsoft Visual .NET 2002 标准版