日期:2014-05-20  浏览次数:20927 次

怎样让执行拖放的时候窗体不会出现"假死"?
我使用DoDragDrop方法拖放把文件复制到别的地方,可是复制文件这个时间很长,这时窗口会出现假死,等到拖放完成之后才会恢复....
可以通过创建新的线程去解决吗?怎么写?
我这样写没有效果...好像是新的线程没法接收到鼠标松开的信号~怎么办?

                        private   void   btn_DragSelecteds_MouseDown(object   sender,   MouseEventArgs   e)
                        {
                                string[]   mypathstr   =   new   string[listView.CheckedItems.Count];
                                for   (int   i   =   0;   i   <   mypathstr.Length;   i++)
                                {
                                        mypathstr[i]   =   ((FileInfo)listView.CheckedItems[i].Tag).FullName;
                                }
                                doDragDropObj   =   new   DataObject(DataFormats.FileDrop,   mypathstr);
                                Thread   myThread   =   new   Thread(doDragDrop);
                                myThread.Start();
                        }
                        //------
                        private   void   doDragDrop()   {
                                Control   myctr   =   new   Control();
                                myctr.DoDragDrop(doDragDropObj,   DragDropEffects.All);
                        }

------解决方案--------------------
复制文件的事件扔给委托去做
------解决方案--------------------
要不用子线程去做也可以
------解决方案--------------------
建议用委托。
------解决方案--------------------
学习一下多线程编程技术。
------解决方案--------------------
新的线程没法接收到鼠标松开的信号
---------------------------------------

你的线程是你自己定义的,你又没让它响应mouseup的事件。它当然不知道你什么时候松开的了。

你的这个线程是为了复制,可以加个循环,复制完成后把线程释放。

while(复制已完成)
myThread.abort();

复制已完成用什么来标志,你看看程序里用什么比较合适。建议把doDragDrop() 定义成bool,复制完成返回true。把这个值传回。
------解决方案--------------------
BackGroundWorker,都封装好了,简单好用
------解决方案--------------------
委托实现文件拷贝,参考一下:
//文件拷贝事件参数