加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:13:43 所属栏目:百科 来源:网络整理
导读:我正在做一个Drag Drop到外部应用程序,如下所示: string[] files = new string[/* */];// get filesDataObject o = new DataObject(DataFormats.FileDrop,files);DoDragDrop(o,DragDropEffects.Copy | DragDropEffects.Move); 一些应用程序将采取文件并继续
我正在做一个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函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读