8

我正在对外部应用程序进行拖放,如下所示:

string[] files = new string[/* */];

// get files

DataObject o = new DataObject(DataFormats.FileDrop, files);
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move);

有些应用程序会获取文件并继续处理它们,我的应用程序可以自由地做这些事情,但是有些应用程序会让我的应用程序冻结,直到它处理所有文件......有什么办法可以解决这个问题吗?我曾尝试在线程中执行此操作,但效果不佳 - 它根本不起作用......所以,任何建议如何使此代码不会挂起我的应用程序?

4

2 回答 2

3

.NET Control.DoDragDrop 只是 Win32 api 周围的一个 wapper 调用..(等待它).. DoDragDrop

所以它有同样的限制。DoDragDrop 只能从已调用的线程中调用OleInitialize,这使得该线程成为 STA(单线程单元)类型的线程。

因为它只能由 STA 线程使用,并且 API 设计是同步的,所以您将受制于目标应用程序对丢弃通知的处理。这只是 OLE 拖放设计的一部分,不能更改。(OLE 拖放实际上是在 Windows 3x 天设计的,甚至在 Windows 应用程序中还存在线程之前)。

因此,您可以另一个线程 IFF 该线程是 STA 线程上进行这项工作。您可能还必须使用互操作来调用非托管DoDragDrop函数。

于 2010-01-29T01:46:48.913 回答
0

它总是会冻结,但对于小文件,延迟并不明显。看看这个答案

于 2010-09-15T23:09:32.057 回答