我从这里http://msdn.microsoft.com/en-us/magazine/cc163851.aspxFileUtilities.CopyFile
使用CopyFileEx 的包装器。我认为直到文件被复制后才会被调用(我试过复制一个大文件)。因此问这个我如何让 CopyFileEx 报告回来,以便我可以取消文件复制操作?问题。但是现在我发现它实际上被调用了很多次,但是由于某种原因,它弄乱了我试图显示进度的表单——在复制完成之前表单不会更新。事实上,如果我尝试在事件处理程序中运行它——表单有空框,按钮应该是——直到复制完成。这是为什么?CopyFileCallbackAction
Shown
问问题
1688 次
1 回答
9
您将需要CopyFileEx
从后台线程调用。目前调用CopyFileEx
正在阻塞 UI 线程。这就是 UI 不更新的原因。
回调动作确实被重复调用。这样您就可以向用户报告长时间运行的文件操作的进度。
需要明确的是,这就是您调用时会发生的情况CopyFileEx
:
Enter CopyFileEx
Start copying
Call your callback
Continue copying
Call your callback
....
Return from CopyFileEx
在文件复制的整个过程中,执行线程忙于复制文件而不是泵送消息队列。尽管这是 WinForms 而不是 Win32,但 WinForms 是围绕标准 Win32 GUI 框架的相对轻量级的包装器。您的消息队列需要定期维护,因此所有长时间运行的任务都需要远离 UI 线程。
最后一点:请记住,当您获得进度回调时,您需要使用Invoke
或BeginInvoke
更新任何 UI。这是因为更新 UI 的代码需要从 UI 线程运行。
于 2011-12-05T23:25:41.927 回答