System.InvalidOperationException:DragDrop注册没有 成功。 ---> System.Threading.ThreadStateException:
这个例外是什么意思?我在这一行试图在运行时向面板添加一个面板......
splitReport.Panel1.Controls.Add(ChartPanel);
在VS2008 C#中工作
答案 0 :(得分:35)
此异常表示已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程。拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM)。线程模型是COM平台的一个不幸的遗迹,它是.NET平台的前身。
如果Main函数上有[STAThread]
属性,那么主程序线程应该已经是STA。那么,最可能的解释是这个异常发生在另一个线程上。发生异常时,查看Visual Studio(调试| Windows |线程)中的“线程”窗口,看看您是否在主线程以外的线程上。如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以按照以下步骤操作(将此代码添加到创建控件的线程中):
Thread.CurrentThread.SetApartmentState( ApartmentState.STA )
(Thread
和ApartmentState
是System.Threading
)
在实际启动新线程之前,需要执行该代码。正如@Tomer所述,您还可以使用[STAThread]
属性以声明方式指定此内容。
如果您发现主要线程上发生异常,请回发并告知我们,也许我们可以提供更多帮助。异常时的堆栈跟踪可能有助于追踪问题。
答案 1 :(得分:5)
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
}
答案 2 :(得分:3)
在Main方法上添加STAThreadAttribute属性。如果您的程序访问OLE相关函数(如Clipboard类,则需要此属性。
)<强> [STAThread] 强>
static void Main(string [] args)
{
}
答案 3 :(得分:2)
我不确定你是否已经解决了这个问题。我刚遇到这个问题,我用deleting my bin
directory修复了它。
答案 4 :(得分:2)
是的,我意识到这个问题是在两年半前提出来的。我点击了这个例外并做了一些阅读。我纠正了它,但没有在任何地方看到我的解决方案,所以我想我会把它发布在别人可以阅读的地方。
在[STAThread]
上标记为Main()
的情况发生这种情况的一种可能性是,如果您在您开始使用的线程之外的其他线程上运行此功能。
我尝试在BackgroundWorker.DoWork
方法中创建并显示新表单时遇到此异常。为了解决这个问题,我将创建和显示我的新表单包装到一个方法中,然后在该方法上调用Invoke
,以便在UI线程上触发它。这很有效,因为UI线程是从标有Main()
的{{1}}方法开始的,这里解释了其他答案。
答案 5 :(得分:1)
到目前为止最简单的方法是:
private void DoSomethingOnGui()
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
Safe_DoSomethingOnGui();
});
}
else
{
Safe_DoSomethingOnGui();
}
}
private void Safe_DoSomethingOnGui()
{
// Do whatever you want with the GUI
}
你甚至可以毫无问题地传递信息:
private void DoSomethingOnGui(object o)
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
Safe_DoSomethingOnGui(o);
});
}
else
{
Safe_DoSomethingOnGui(o);
}
}
private void Safe_DoSomethingOnGui(object o)
{
// Do whatever you want with the GUI and o
}
答案 6 :(得分:1)
我通过使用下面的代码解决了这个错误...我正在使用Background Worker并尝试访问UI而后台worker ...这就是为什么得到错误 - DragDrop注册没有成功。 我们无法从后台工作程序或线程中运行的代码访问UI。
BeginInvoke((MethodInvoker)delegate
{
//write your code here...
});
谢谢Happy Coding ......:
答案 7 :(得分:0)
我最近遇到过这种情况,[STAThreadAttribute]
在我的情况下,我通过使用调用方法解决了这个问题,它可能对你们有帮助,所以我分享了小代码片段:
this.Invoke(new InvokeHandler(delegate()
{
//Your method here!
}));
InvokeHandler是这样的委托:
private delegate void InvokeHandler();
答案 8 :(得分:0)
我发现了这个错误,我发现显示它的那个是在使用另一个调用MessageBox.Show(this, ...)
的线程时,这里没有进行初始化。
我们需要删除消息框的所有者才能删除错误。