arg*_*rgh 7 c# drag-and-drop freeze winforms
我正在做一个Drag Drop到外部应用程序,如下所示:
string[] files = new string[/* */];
// get files
DataObject o = new DataObject(DataFormats.FileDrop, files);
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move);
Run Code Online (Sandbox Code Playgroud)
一些应用程序将采取文件并继续处理它们,我的应用程序是免费的,但一些应用程序将使我的应用程序冻结,直到它处理所有文件...有什么办法可以解决这个问题吗?我试过在一个线程中做到这一点但是效果不是很好 - 它根本不起作用...所以,任何建议如何使这个代码不挂我的应用程序?
.NET Control.DoDragDrop 只是一个围绕 Win32 api 的 wapper,称为..(等等).. DoDragDrop
所以它也有同样的局限性。DoDragDrop 只能从调用过 的线程中调用OleInitialize,这使得该线程成为 STA(单线程单元)类型线程。
由于它只能由 STA 线程使用,并且 API 设计是同步的,因此您将受到目标应用程序对删除通知的处理的影响。这只是 OLE 拖放设计的一部分,无法更改。(OLE 拖放实际上是在 Windows 3x 时代设计的,甚至在 Windows 应用程序中存在线程之前)。
因此,您也许可以在另一个线程上执行此操作,前提是该线程是 STA 线程。您可能还必须使用互操作来调用非托管DoDragDrop函数。
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |