Visual Basic 2005 ここが便利!

第4回 Background Workerで夢のマルチスレッドがついに!

株式会社ピーデー 川俣 晶
2005/05/14
Page1 Page2

さあ、別天地に案内しよう

 Visual Basic 2005は、ここまで読んできたようなスレッドにまつわるややこしい問題の多くをきれいサッパリ吹き飛ばしてくれる。具体的にいえば、Windowsアプリケーションで使用できる「Background Workerオブジェクト」という機能を使うことで、難しいキーワードについて学ぶことなく、いともあっさりと別スレッドの処理を記述できる。

 実際に上のプログラムと同等の内容をBackground Workerオブジェクトを使って書き直してみよう。このオブジェクトを使うには、ツールボックスの[コンポーネント]部分にある[BackgroundWorker]を、フォーム上にドラッグして配置する。あとは、上のサンプル・コードと同様に、LabelコントロールとButtonコントロールを1つずつ貼り付けておこう。

 BackgroundWorkerコンポーネントはタイマー(Timerコンポーネント)などと同じように、フォーム上に貼り付くコントロールではなく、その下のエリアに組み込まれて表示される。

BackgroundWorkerコンポーネントを配置したWindowsフォーム
画面はVisual Basic 2005 Express Editionの日本語版ベータ2。

 これを選択して、そのRunWorkerCompletedイベント・ハンドラと、DoWorkイベント・ハンドラを以下のように作成する。もちろん、ボタンのClickイベント・ハンドラも作成しておこう。上のサンプル・コードと同等の機能を発揮するコードは以下のようになる。実際に記述するコードはわずか3行だけだ。

Public Class Form1
  Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    System.Threading.Thread.Sleep(New TimeSpan(0, 0, 3))
  End Sub

  Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Me.Label1.Text = "Done!"
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.BackgroundWorker1.RunWorkerAsync()
  End Sub
End Class
Background Workerオブジェクトを使用したサンプル・コード
別スレッドで行う処理をDoWorkイベント・ハンドラ(BackgroundWorker1_DoWorkメソッド)に、その処理が完了したときに行う処理をRunWorkerCompletedイベント・ハンドラ(BackgroundWorker1_RunWorkerCompletedメソッド)に記述するだけでよい。

 さあ見てくれたまえ。Delegate、Invoke、AddressOfなどの難しいキーワードは追放された。そして、スレッドとして実行する内容や、終了時の処理は、「イベント」として書き込むことができる。つまり、統合開発環境がどのようなメソッドを書けばよいか、スレッド処理の枠組みをおぜん立てしてくれるのでラクチンである。

 ここで、BackgroundWorker1_DoWorkメソッドは、最初のサンプル・コードのdoWorkメソッドに対応する。そして、BackgroundWorker1_RunWorkerCompletedメソッドは、最初のサンプル・コードのcompletedメソッドに対応する。しかし、doWorkメソッドからcompletedメソッドを呼び出すInvokeメソッドがもはや存在しないことに注目しよう。それに相当する処理は、Background Workerオブジェクトがやってくれるので、もはやプログラマが書く必要はないのである。

 唯一、戸惑いを感じる部分があるとすれば、RunWorkerAsyncという見慣れないメソッドを呼び出しているところだろう。しかし、不安を感じる必要はない。これは、作業を行うメソッド(Worker)を、別のスレッドで非同期(Async)に、実行せよ(Run)という指示を行う役割を持ったメソッドであり、要はスレッドをスタートさせたいタイミングに呼び出せばよいだけである。

 かつて、一部のVBプログラマは、マルチスレッドという夢を見てきた。しかし、それはVisual Basicがバージョン・アップするごとに裏切られてきたといえる。だがその状況に終止符が打たれるときが来た。

 もちろん、Background Workerオブジェクトがあればすべての問題が解決するわけではない。依然として、スレッド間の競合を回避するために配慮すべき問題は残る。だが、Background Workerオブジェクトにより、マルチスレッドに取り組むためのハードルが著しく下がったことは間違いないだろう。

 少なくとも、また1つ、Visual Basicが他言語に対して抱えるハンデは1つ解消されたのである。そして、それはVisual Basicによって生み出されるプログラムの使い勝手の快適さを改善する効能があると期待してよいのではないだろうか? ぜひとも、マルチスレッドを避けてきたVBプログラマも、Visual Basic 2005でマルチスレッドに挑戦してみようではないか!End of Article


 INDEX
  Visual Basic 2005 ここが便利!
  第4回 Background Workerで夢のマルチスレッドがついに!
    1.VBプログラマの不幸とThreadクラスを使ったマルチスレッド
  2.さあ、別天地に案内しよう - Visual Basic 2005でマルチスレッド
 
インデックス・ページヘ  「Visual Basic 2005 ここが便利!」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH