gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:30:53 27 4
gpt4 key购买 nike

我在此处使用 CopyFileEx 的 FileUtilities.CopyFile 包装器 http://msdn.microsoft.com/en-us/magazine/cc163851.aspx .我认为 CopyFileCallbackAction 直到文件被复制后才会被调用(我试过复制一个大文件)。因此问这个How do I get CopyFileEx to report back so I can cancel a file copy operation?问题。但现在我发现它实际上被调用了很多次,但出于某种原因,它弄乱了我试图显示进度的表单——在复制完成之前,表单不会得到更新。事实上,如果我尝试在 Shown 事件处理程序中运行它——表单在按钮应该位于的位置有空框——直到复制完成。这是为什么?

最佳答案

您需要从后台线程调用 CopyFileEx。目前,对 CopyFileEx 的调用正在阻塞 UI 线程。这就是 UI 不更新的原因。

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

需要说明的是,调用 CopyFileEx 时会发生以下情况:

Enter CopyFileEx
Start copying
Call your callback
Continue copying
Call your callback
....
Return from CopyFileEx

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

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

关于c# - 为什么 CopyFileEx 的 FileUtilities.CopyFile 包装器会干扰 winforms?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com