やっぱりWindowsのアプリを作るからにはUIは操作できるようにたくなったので。
ポイントとしてはこんなとこっぽい。
- BackgoundWorkerをフォームへ追加
- BackgroundWorkerへ処理を追加する
- BackgroundWorkerの動作イベントを呼び出す(今回はフォームをロードしたら動作するようにする)
まずは、メインにするフォームをこんな感じで作っとく。
- フォームのクラス名はMainForm、タイトルバーの表示はProtoってした。
- ツールボックスのBackgroundWorkerをフォームに追加する。
- 今回はフォームが表示されたときに並列処理を開始したいので、フォームのイベントでLoadの項目にメソッドを追加する。
メソッド名はOnLoadって名前にした。
- BackgroundWorkerのイベントでDoWorkっていう実際に並列処理をするイベントと、RunWorkerCompletedっていう処理が終了したときのイベントを追加しとく。
メソッド名はDoWorkがOnDoWorkって名前、RunWorkerCompletedがOnRunWorkerComletedって名前にした。
んで、コード。
まずはフォームをロードしたときのイベントで、OnLoadメソッドのコードはこんな感じ。
BackgroundWorkerクラスのインスタンスのRunWorkerAsync()ってメソッドを呼び出すようにコードを書いとく。
/// <summary> /// フォームをロードしたときのイベント /// </summary> /// <param name="sender">イベントを呼び出したオブジェクト</param> /// <param name="e">イベントの引数</param> private void OnLoad(object sender, EventArgs e) { // 並列処理を開始する MainBackgroundWorker.RunWorkerAsync(); }
次はBackgroundWorkerクラスのインスタンスで並列処理をするときのイベントで、OnDoWorkerメソッドのコードはこんな感じ。
とりあえずメッセージボックスで処理が始まったよ?って事を表示したあとで何もせずに10秒待つって内容にした。
/// <summary> /// 並列処理のイベント /// </summary> /// <param name="sender">イベントを呼び出したオブジェクト</param> /// <param name="e">イベントの引数</param> private void OnDoWorker(object sender, DoWorkEventArgs e) { // 処理を開始する MessageBox.Show("処理を開始します"); System.Threading.Thread.Sleep(10000); }
んで、並列処理が終わったときのイベントで、OnRunCompletedメソッドのコードはこんな感じ。
なんもなしでシレッと終わったらわからないので、これまたメッセージボックスを表示するようにした。
/// <summary> /// 並列処理が終了したときのイベント /// </summary> /// <param name="sender">イベントを呼び出したオブジェクト</param> /// <param name="e">イベントの引数</param> private void OnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // 処理を終了したことを通知する MessageBox.Show("処理を終了しました"); }
んで、実行したらこんな感じ。
- 実行するとすぐにこんなメッセージボックスが表示される。
- んで、メイン画面が表示される。
このとき既に並列処理が始まってるんだけど、ちゃんとマウス操作もできる。
- 10秒すると何もしていないのにこんなメッセージボックスが表示される。
ちなみに、進捗を検知するイベントは次回…。
そんなこんなで、明日への自分へのメモってことで。