c# – DoDragDrop有时会冻结WinForms应用程序

前端之家收集整理的这篇文章主要介绍了c# – DoDragDrop有时会冻结WinForms应用程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在做一个Drag Drop到外部应用程序,如下所示:
string[] files = new string[/* */];

// get files

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

一些应用程序将采取文件并继续处理它们,我的应用程序是免费的,但一些应用程序将使我的应用程序冻结,直到它处理所有文件…有什么办法可以解决这个问题吗?我试图在一个线程中做到这一点但是效果不是很好 – 它根本不起作用…所以,任何建议如何使这个代码不挂我的应用程序?

解决方法

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

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

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

所以,你可以让这个工作在另一个线程IFF上,该线程是一个STA线程.您可能还必须使用interop来调用非托管的DoDragDrop函数.

猜你在找的C#相关文章