Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Application.DoEvents メソッドを使うべきでない理由

どういうこと?

Application.DoEvents メソッドはもはや使うべきではありません。

どうして?

Application.DoEvents メソッド (System.Windows.Forms)
メッセージ キューに現在ある Windows メッセージをすべて処理します。 ...

このメソッドを呼び出すと、現在のスレッドは中断しますが、すべての待機ウィンドウ メッセージが処理されます。 メッセージによってイベントがトリガーされる場合、アプリケーション コードの他の部分が実行される場合があります。 このために、デバッグが困難な予期しない動作がアプリケーションで発生する可能性があります。

非同期プログラミング - 新しい Visual Studio Async CTP により容易になった非同期プログラミング

要するに、DoEvents は、状況がごく単純なときに応答性の問題を解決するためのものであり、複雑なプログラムで UI の応答性を管理するのに適切な解決策であるとは言えません。

VB2005 ボタン二度押し防止方法
Windows Formのボタンの二度押し防止方法ですが、別フォーラムでも同トピック、議論はあるものの 正解らしい回答を見たことがありません。変数でENABLE/DISABLEにするという案はありま すが通常はどのような処理がよいのでしょうか? ...

Application.DoEventsを使う手法は、私はよくないと思います。イベントドリブン方式のプログラミングの基本を考えれば分かると思うのですが、イベント中にメッセージループを回すのは危険がたくさんあります。内部で何がおこっているのか、きちんと理解して使うなら問題ないのですが、Windowsのコードは公開されていませんので、中で何が起こっているのか調べようがありませんし、ある程度検証してもバージョンが変わったら変わる可能性もあります。

どうすれば?

非同期プログラミング モデル (APM)
IAsyncResult デザイン パターンを使用する非同期操作は、BeginOperationName および EndOperationName という名前の 2 つのメソッドとして実装されます。これらは、非同期操作 OperationName をそれぞれ開始および終了するものです。 ...

VB2005 ボタン二度押し防止方法
Windows Formのボタンの二度押し防止方法ですが、別フォーラムでも同トピック、議論はあるものの 正解らしい回答を見たことがありません。変数でENABLE/DISABLEにするという案はありま すが通常はどのような処理がよいのでしょうか? ...

Application.Idleイベントを使い、処理中フラグのON/OFFを切り替え、OFFのときにのみ処理を行うようにします。もしくは、

細切れにしてTimerで行う

関連エントリー

ボタン二度押し対応のサンプル - プログラマーな日々
Windowsフォームアプリのボタン連打対応のサンプルです。ボタンクリック処理中のボタン再押下を無効化します。 ...