Вам нужно будет позвонить CopyFileEx
из фонового потока.На данный момент вызов CopyFileEx
блокирует поток пользовательского интерфейса.Вот почему пользовательский интерфейс не обновляется.
Действие обратного вызова действительно вызывается неоднократно.Это сделано для того, чтобы вы могли сообщать пользователю о ходе выполнения длительной операции с файлом.
Просто чтобы прояснить ситуацию, это то, что происходит при вызове CopyFileEx
:
Enter CopyFileEx
Start copying
Call your callback
Continue copying
Call your callback
....
Return from CopyFileEx
В течение всего времени копирования файла исполняющий поток занят копированием файла, а не прокачкой очереди сообщений.Хотя это WinForms, а не Win32, WinForms представляет собой относительно легкую оболочку для стандартной среды Win32 GUI.Вашу очередь сообщений необходимо регулярно обслуживать, поэтому все выполняющиеся задачи необходимо запускать из потока пользовательского интерфейса.
И последнее замечание: помните, что когда вы получаете обратный вызов прогресса, вам нужно использовать Invoke
или BeginInvoke
при обновлении любого пользовательского интерфейса.Это связано с тем, что код, который обновляет пользовательский интерфейс, должен запускаться из потока пользовательского интерфейса.