此异常意味着已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程.拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM).线程模型是COM的一个不幸的遗迹,它是.NET平台的前身.
如果您[STAThread]
的Main函数具有该属性,则主程序线程应该已经是STA.那么,最可能的解释是这个异常发生在另一个线程上.发生异常时,查看Visual Studio(调试| Windows |线程)中的"线程"窗口,看看您是否在主线程以外的线程上.如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以执行以下操作(将此代码添加到创建控件的线程中):
Thread.CurrentThread.SetApartmentState( ApartmentState.STA )
(Thread
并且ApartmentState
是其成员System.Threading
)
在实际启动新线程之前,需要执行该代码.正如@Tomer所述,您也可以使用该[STAThread]
属性以声明方式指定.
如果您发现主线程上发生异常,请回发并告知我们,也许我们可以提供更多帮助.异常时的堆栈跟踪可能有助于追踪问题.
此异常意味着已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程.拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM).线程模型是COM的一个不幸的遗迹,它是.NET平台的前身.
如果您[STAThread]
的Main函数具有该属性,则主程序线程应该已经是STA.那么,最可能的解释是这个异常发生在另一个线程上.发生异常时,查看Visual Studio(调试| Windows |线程)中的"线程"窗口,看看您是否在主线程以外的线程上.如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以执行以下操作(将此代码添加到创建控件的线程中):
Thread.CurrentThread.SetApartmentState( ApartmentState.STA )
(Thread
并且ApartmentState
是其成员System.Threading
)
在实际启动新线程之前,需要执行该代码.正如@Tomer所述,您也可以使用该[STAThread]
属性以声明方式指定.
如果您发现主线程上发生异常,请回发并告知我们,也许我们可以提供更多帮助.异常时的堆栈跟踪可能有助于追踪问题.
function abc { Thread t = new Thread(new ThreadStart(xyz)); t.SetApartmentState(ApartmentState.STA); t.Start( ); } function xyz { the code of Windows form..or whatever which is causing the error }