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は、標準のWin32GUIフレームワークの比較的軽量なラッパーです。メッセージキューは定期的に処理する必要があるため、長時間実行されるすべてのタスクをUIスレッドから実行する必要があります。

最後のポイント:進行状況のコールバックを取得するときは、UIを使用するInvokeか更新する必要があることを忘れないでください。BeginInvokeこれは、UIを更新するコードをUIスレッドから実行する必要があるためです。

于 2011-12-05T23:25:41.927 に答える