2

我从这里http://msdn.microsoft.com/en-us/magazine/cc163851.aspxFileUtilities.CopyFile使用CopyFileEx 的包装器。我认为直到文件被复制后才会被调用(我试过复制一个大文件)。因此问这个我如何让 CopyFileEx 报告回来,以便我可以取消文件复制操作?问题。但是现在我发现它实际上被调用了很多次,但是由于某种原因,它弄乱了我试图显示进度的表单——在复制完成之前表单不会更新。事实上,如果我尝试在事件处理程序中运行它——表单有空框,按钮应该是——直到复制完成。这是为什么?CopyFileCallbackActionShown

4

1 回答 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 线程。

最后一点:请记住,当您获得进度回调时,您需要使用InvokeBeginInvoke更新任何 UI。这是因为更新 UI 的代码需要从 UI 线程运行。

于 2011-12-05T23:25:41.927 回答