使用MTAThread时使用拖放功能

时间:2011-04-13 00:37:06

标签: c# drag-and-drop

今天我遇到了一个特殊的问题,DragDrop函数在使用MTAThread时不起作用。我搜索过MSDN,我用谷歌搜索了关键词的各种组合。

任何人都可以向我解释为什么不允许这样做?有没有办法解决它?

1 个答案:

答案 0 :(得分:1)

我认为您会收到以下错误,这可能会解释原因:

System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.

通常,在创建UI的任何线程上使用STAThread以防止无响应/挂起UI。没有什么可以阻止您为窗口创建单独的线程(但STA),以便您的UI响应:

 Thread thread = new Thread(() =>
  {
     Window1 w = new Window1();
     w.Show();

     System.Windows.Threading.Dispatcher.Run();
  });



  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();

可以有工作线程,可以是MTA。工作线程可以通过将消息传递给Dispatcher(在WPF的情况下)与UI线程交互

看看这篇博文,旧的,但提供了有关公寓和抽水的大量信息

Apartments and Pumping in the CLR