はじめに
皆さん、こんにちは。
株式会社コズムのNGUYEN(グエン)と申します。
.Net Windows Formアプリケーションを開発する際、ロジック処理中の画面にリアルタイムの更新が必要な時があります。
例えば、ファイルのダウンロードを行うような.Net Windows Formプログラムを作成する際、画面に更新対象データのダウンロード済みパーセントを表示する。などです。
今回、このサンプルの一つの実装方法としてC#でObserverデザインパターンと非同期処理を結合する方法を紹介していきます。
記事の対象者
- .Net Windows Formアプリケーションの開発者
- Observerデザインパターンに対する知見がある方
- 非同期処理(Thread)に対する知見がある方
詳細
.Net Windows Formアプリケーションでは基本的に、画面の項目を表示する処理(例:Labelでテキストの内容を設定処理)がUIスレッドで実装されます。ロジック実行中は画面項目の表示が変更されず、ロジックの実行が完了した後に画面が変更されます。
例えば、以下のようなコードがあるとすると、
btnExecuteLogic_Click関数の処理の実行中は lblStatusのテキストの更新はできず、ボタンの処理が終わった後に「処理完了」と表示することになります。
もしリアルタイムで画面更新したい場合、 ロジック処理のThreadと画面処理(UIスレッド)を分ける必要があります。
そこで、ロジック処理のThread中に画面更新通知できるようにするため、Observerデザインパターンを適用します。
実装詳細
.Net Windows Formアプリケーションを作成します。このアプリの処理は下記の通りです。
- 指定されたURL(仮のURL)のデータダンロード(zipファイル)
- ダウンロード中に、ステータスとダウンロード済みパーセント表示する画面
実装
1.クラス図
1-1 ApplicationManagerクラス
- Observers:オブザーバーオブジェクトリスト管理、ロジック処理で本クラス経由で画面更新通知
- AddObserverメソッド:オブザーバーオブジェクト追加
- NotifyStatusChanged:ロジック処理中で画面のステータス更新通知
- NotifyDownloadPercentageChanged:ロジック処理のダウンロード処理中で画面のダウンロード済みのパーセントを通知
1-2. IObserverインタフェース
オブザーバーオブジェクトインタフェース
- OnStatusChanged:ロジックのステータス更新通知のハンドル
- OnDownloadding:ダウンロード済みパーセント更新通知のハンドル
1-3. MainLogicクラス
メインロジック実行
- StartLogicAsync:非同期でロジック処理開始
- DoLogic:ロジックのメイン処理
1-4. MainFormフォーム
アプリケーションのメインフォーム
- IObserverインタフェースを実装
2.シーケンス図
3.処理詳細
3-1 フォーム表示
3-2. ロジック実行
3-3. 通知処理
3-4. MainForm(オブザーバー)の通知ハンドル
終わりに
この記事で、Observerデザインパターンと非同期処理(スレッド)の結合によるロジック実行中でも画面更新できるようなサンプルを紹介しました。
簡単なサンプルですので、一つのForm(オブザーバー)を使っていますが、もし必要であればオブザーバーオブジェクトも追加できます。
その場合、ロジック処理で通知すると、複数の画面(またはコンポーネント)の表示を更新できます!
ご質問やご意見がございましたら、ぜひご気軽にコメントください!
それでは、快適な開発ライフをお過ごしください。