C#メモ 並列処理ができるBackgroundWorkerクラスを使ってみる

C#

やっぱりWindowsのアプリを作るからにはUIは操作できるようにたくなったので。
ポイントとしてはこんなとこっぽい。

  • BackgoundWorkerをフォームへ追加
  • BackgroundWorkerへ処理を追加する
  • BackgroundWorkerの動作イベントを呼び出す(今回はフォームをロードしたら動作するようにする)

まずは、メインにするフォームをこんな感じで作っとく。

  1. フォームのクラス名はMainForm、タイトルバーの表示はProtoってした。
  2. ツールボックスのBackgroundWorkerをフォームに追加する。
  3. 今回はフォームが表示されたときに並列処理を開始したいので、フォームのイベントでLoadの項目にメソッドを追加する。
    メソッド名はOnLoadって名前にした。
  4. 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("処理を終了しました");
}

んで、実行したらこんな感じ。

  1. 実行するとすぐにこんなメッセージボックスが表示される。
  2. んで、メイン画面が表示される。
    このとき既に並列処理が始まってるんだけど、ちゃんとマウス操作もできる。
  3. 10秒すると何もしていないのにこんなメッセージボックスが表示される。

ちなみに、進捗を検知するイベントは次回…。

そんなこんなで、明日への自分へのメモってことで。