ループ処理には DoEvents()

C#に限った話ではないですが。

ループ処理を行うと、その間ウィンドウの操作等を全く受け付けなくなります。例えばあるディレクトリの配下にあるファイルの一覧を取得するプログラムを書いた時、場合によってはかなり深い階層を辿って一覧を作ったりますよね。この場合、ループ処理がなかなか終わらないのでそのあいだ他の処理が全く出来なくなります*1

これを避ける為に Application.DoEvents() をループ処理の中に入れてやる訳です。この DoEvents() はウィンドウの操作等のメッセージがキューに溜まってればそちらを処理しろ、という命令です。しかし、キューにメッセージが溜まりまくってたら、もとのループ処理に戻って来るまでかなり時間が掛かったりします。逆に DoEvents() から DoEvents() までの間の処理時間が長いと、その間のウィンドウの操作等が思ったように出来なくなったりします。出来ないよりは全然マシではありますが。

うまく使えば応答速度をそれなりにすることが出来るので、マルチスレッド化する前にまず DoEvents() で出来ないかを検討することが必要です*2。どうしても DoEvents() では無理ということになれば、その時改めてスレッドを分ければ良いのですから。

*1:他のプロセスは動きます

*2:同一プロセスの別スレッドはそれなりに負担になるらしい