こも記事でのAgendaは、以下の通りです。

  • DoEventsって何をやってるんでしょう?
  • デメリットは?
  • 回避するには?

自己学習用のメモですので、内容については参考程度にお読みください。

  • DoEventsって何をやってるんでしょう?

DoEventsでは、制御をOSに渡してメッセージ キューに溜まっている処理を実行します。

そうすることで、処理中にウィンドウの移動などを行うことができます。

デメリットは?

DoEventsを使用すると、処理中であっても、別にイベントが発生してします。

つまり、ウィンドウの移動を行うと、フォームの移動に関するイベントが、ボタンをクリックするとクリックに関するイベントが発生してしまうことになります。

回避するには?

イベントを発生させず、処理中は待たせるだけで良い…と言うのであれば、FormやコントロールのEnableをFalseに設定する以外にも、.netからはマルチスレッド処理ができるのですから、「お待ちくださいフォーム」(命名が下手すぎる)を別スレッドで表示させておく、という方法もあります。

DevExpressでは、簡単に別スレッドで待機フォームを表示させることができます。

(体験版で使ってみてください。待機フォーム以外にも、スプラッシュスクリーンも表示できます。)

処理中でも操作させたい、というのであれば、処理を別スレッドで実行させて、最後に同期でコミットさせればいいのではないでしょうか?

処理中かどうかを確認することで多重実行も防ぐことができます。