为什么CopyFileEx的FileUtilities.CopyFile包装器会干扰winforms?

isp*_*iro 2 c# visual-studio-2010 winforms file-copying

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

Dav*_*nan 9

您需要CopyFileEx从后台线程调用.目前,调用CopyFileEx阻止了UI线程.这就是UI不更新的原因.

回调操作确实是重复调用的.这样您就可以向用户报告长时间运行的文件操作的进度.

为了清楚起见,这就是你打电话时发生的事情CopyFileEx:

Enter CopyFileEx
  Start copying
  Call your callback
  Continue copying
  Call your callback
  ....
Return from CopyFileEx
Run Code Online (Sandbox Code Playgroud)

对于文件复制的整个持续时间,执行线程正在忙于复制文件而不是抽取消息队列.虽然这是WinForms而不是Win32,但WinForms是围绕标准Win32 GUI框架的相对轻量级的包装器.您的消息队列需要定期维护,因此所有长时间运行的任务都需要从UI线程中运行.

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