2011-04-13 41 views
0

今天我遇到了一个奇怪的问题,DragDrop函数在使用MTAThread时不起作用。我搜索了MSDN,并且搜索了关键词的各种组合。在使用MTAThread时使用拖放操作

任何人都可以向我解释为什么这是不允许的吗?有没有办法避开它?

+3

你能解释一下你为什么使用'MTAThread'吗?许多包装其COM组件的Windows窗体控件都需要'STAThread'。 – 2011-04-13 00:48:57

+1

请参阅http://stackoverflow.com/questions/102437/why-do-all-winforms-programs-require-the-stathread-attribute – heavyd 2011-04-13 00:52:22

+1

需要STA。从来没有真正的问题,你在UI对象之间拖动。 – 2011-04-13 01:06:34

回答

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序,以防止反应迟钝/挂UI任何线程使用STAThread。没有什么能阻止你从一个窗口中创建一个单独的线程(但STA)使你的UI响应:

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

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



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

可以有工作线程可以是MTA。工作线程(S)可以通过传递消息到Dispatcher(在WPF的情况下)

看一看这个博客帖子,老带UI线程交互,但提供了很多的信息,公寓和泵送

Apartments and Pumping in the CLR