DoDragDrop有时会冻结WinForms应用程序

时间:2010-01-28 15:19:03

标签: c# winforms drag-and-drop freeze

我正在对此外部应用进行拖放:

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

// get files

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

并且一些应用程序将获取文件并继续处理它们并且我的应用程序可以自由地执行它,但是一些应用程序将使我的应用程序冻结,直到它处理所有文件...有什么方法我可以去那个?我试图在一个线程中做到这一点但是效果不是很好 - 它根本不起作用...所以,如何制作这些代码的任何建议都不会挂起我的应用程序?

2 个答案:

答案 0 :(得分:3)

.NET Control.DoDragDrop只是一个围绕Win32 api的wapper,叫做..(等待它).. DoDragDrop

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

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

所以,你可以也许在另一个线程上使这个工作IFF该线程是一个STA线程。您可能还必须使用互操作来调用非托管DoDragDrop函数。

答案 1 :(得分:0)

它将始终冻结,但小文件的延迟不明显。查看this answer