マルチスレッド Windows フォームアプリケーションの開発

というわけでまたしてもかなり日にちが空いてしまいました;。年度末ということもあって仕事が立て込んでいたのですが、ほぼ一段落したので久しぶりにエントリを。どうしてもまとまった話題を書こうとすると時間がかかっちゃいますね....

今回の話題は、Windows フォームにおけるマルチスレッド処理の正しい書き方です。以前、マルチスレッドアプリケーションにおけるデータ変数の排他制御(スレッドセーフか否かの判定)についてこちらこちらのエントリに書きましたが、さらにもう少し応用的なトピックとして、Windows フォームにおけるマルチスレッド処理について解説したいと思います。

この辺の話は、C++ でアプリケーションを作られている方には当たり前の話(らしい)のですが、私のような pure .NET デベロッパーな人にはあまり馴染みのない話だと思います。しかし、C# や VB でしか Windows フォームのアプリケーションを書いたことがない人であっても、うまくコードを書かないと、下図のような「フリーズしてしまう」アプリケーションができあがってしまいます。

image

今回のエントリでは、以下について解説します。

  • そもそもなぜ UI のフリーズ現象は発生するのか? それはどうすれば回避できるのか?
  • Windows フォームにおける UI スレッドの位置づけ
  • Windows フォーム上で、背後にスレッドを起こすための適切な方法

では、以降のエントリでこれらについて解説していきます。

[Part 1. Windows フォームのマルチスレッド処理の基礎]

  • メッセージキューとメッセージループ
  • UI フリーズの発生理由
  • Windows フォーム上でのマルチスレッド処理の基本ルール
  • BeginInvoke() 命令
  • 最も簡単なマルチスレッドアプリケーション
  • Windows フォームにおけるスレッドの種類

[Part 2. タスクスレッドの起動方法]

  • マニュアルスレッドの新規作成
  • スレッドプールへのワークアイテムの追加
  • 非同期デリゲートの利用
  • タイマの利用

[Part 3. タスクスレッドと UI の協調動作]

  • タスクスレッドからの UI 画面の更新方法
  • タスクスレッドからの UI 画面上のデータの読み取り方法
  • UI 画面からのタスクスレッドの制御方法
  • タスクスレッド上で発生した未処理例外の取り扱い方法

[Part 4. Visual Studio によるマルチスレッドアプリの開発]

  • XML Web サービス呼び出しの非同期処理化
  • WCF サービス呼び出しの非同期処理化
  • BackgroundWorker コンポーネントによる一般的なタスクの非同期処理化