クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
Visual Studio 2008
Visual Studio
Visual Basic
 マルチスレッド アプリケーション

  低帯域幅での表示をオンにする
このページは次のバージョンについて記述しています。
Microsoft Visual Studio 2008/.NET Framework 3.5

その他のバージョンについては、以下の情報を参照してください。
Visual Basic のプログラミング ガイド
マルチスレッド アプリケーション

更新 : 2007 年 11 月

Visual Basic では、複数のタスクを同時に実行するアプリケーションを作成できます。他のタスクを停止させる可能性のあるタスクは別のスレッドで実行できます。これは、マルチスレッドまたはフリー スレッドと呼ばれるプロセスです。

マルチスレッドを使用するアプリケーションでは、プロセッサ集中型のタスクを別のスレッドで実行している間もユーザー インターフェイスがアクティブに保たれるため、ユーザー入力に対する応答性がより高くなります。マルチスレッドは、作業負荷が増加すると同時にスレッドを追加できるため、スケーラブルなアプリケーションを作成するときにも役立ちます。

マルチスレッド アプリケーションを作成する最も信頼性の高い方法は、BackgroundWorker コンポーネントを使うことです。このクラスは、指定したメソッドのみを処理する独立したスレッドを管理します。カスタマイズ例については、「チュートリアル : マルチスレッド」を参照してください。

処理をバックグラウンドで開始するには、BackgroundWorker を作成し、処理の進行の報告と、処理が完了した時点の通知をするイベントを待機します。BackgroundWorker オブジェクトは、プログラムで作成できます。また、ツールボックス[コンポーネント] タブからフォーム上にドラッグすることもできます。BackgroundWorkerフォーム デザイナで作成すると、このオブジェクトがコンポーネント トレイに表示され、そのプロパティが [プロパティ] ウィンドウに表示されます。

バックグラウンド処理をセットアップするには、DoWork イベントにイベント ハンドラを追加します。時間のかかる処理は、このイベント ハンドラの内部で呼び出します。

処理を開始するには、RunWorkerAsync を呼び出します。更新の進行状況に関する通知を受け取るには、ProgressChanged イベントを処理します。処理完了の通知を受け取るには、RunWorkerCompleted イベントを処理します。

ProgressChanged イベントと RunWorkerCompleted イベントは RunWorkerAsync メソッドの呼び出し元のスレッドに生成されるので、これらのイベントを処理するメソッドは、アプリケーションのユーザー インターフェイスにアクセスできます。ただし、DoWork イベント ハンドラは、バックグラウンド スレッドで動作するので、ユーザー インターフェイス オブジェクトと共に操作することはできません。

アプリケーションのスレッドの動作をもっと細かく制御する必要がある場合は、スレッドそのものを管理します。ただし、マルチスレッド アプリケーションを正しく作成することは簡単ではありません。競合状態の発生によってアプリケーションが応答しなくなることや一時的なエラーが発生することがあります。詳細については、「スレッドセーフ コンポーネント」を参照してください。

Visual Basic で新規スレッドを作成するには、Thread 型の変数を宣言し、AddressOf ステートメントおよび新規スレッドで実行するプロシージャ名またはメソッド名を使用してコンストラクタを呼び出します。次に例を示します。

Visual Basic
Dim TestThread As New System.Threading.Thread(AddressOf TestSub)

スレッドの開始と停止

新規スレッドの実行を開始するには、次のコードに示すように Start メソッドを使用します。

Visual Basic
TestThread.Start()

スレッドの実行を停止するには、次のコードに示すように Abort メソッドを使用します

Visual Basic
TestThread.Abort()

スレッドの開始と停止の他、次のコードに示すように Sleep メソッドや Suspend メソッドを呼び出してスレッドを一時停止したり、中断しているスレッドを Resume メソッドで再開したり、Abort メソッドを使用してスレッドを破棄したりできます。

Visual Basic
TestThread.Sleep(1000)
TestThread.Abort()

スレッドのメソッド

個別のスレッドを制御するために使用できるメソッドの一部を次の表に示します。

メソッド

動作

Start

スレッドの実行を開始します。

Sleep

スレッドを一定の時間中断します。

Suspend

セーフ ポイントに達したスレッドを一時中断します。

Abort

セーフ ポイントに達したスレッドを中断します。

Resume

中断しているスレッドを再開します。

Join

別のスレッドが終了するまで現在のスレッドを待機させます。タイムアウト値を指定してこのメソッドを使用すると、指定の時間内でスレッドが終了した場合、True が返されます。

セーフ ポイント

これらのメソッドの大部分は自明ですが、セーフ ポイントは新しい概念です。セーフ ポイントとは、共通言語ランタイムが自動ガベージ コレクション、つまり不要な変数を解放し、メモリを再要求するプロセスを安全に実行できるコード内の場所です。スレッドの Abort メソッドまたは Suspend メソッドを呼び出すと、共通言語ランタイムがコードを分析し、スレッドの実行を停止してもよい場所を探します。

スレッドのプロパティ

スレッドには、次の表に示すように、複数の便利なプロパティが用意されています。

プロパティ

IsAlive

スレッドがアクティブな場合、値は True です。

IsBackground

スレッドがバックグランウンド スレッドであるかどうかを示す、ブール型を取得または設定します。バックグラウンド スレッドは、フォアグラウンド スレッドと似ていますが、プロセスの終了を防止しません。プロセスに属するフォアグラウンド スレッドがすべて終了すると、共通言語ランタイムは、まだ動作しているバックグラウンド スレッドの Abort メソッドを呼び出してプロセスを終了します。

Name

スレッドの名前を取得または設定します。デバッグ時の個別のスレッドの検出に、最もよく使用されます。

Priority

オペレーティング システムがスレッドのスケジュールに優先順位を示す値を取得または設定します。

ApartmentState

特定のスレッドに使用するスレッド モデルを取得または設定します。スレッド モデルは、スレッドがアンマネージ コードを呼び出すときに重要です。

ThreadState

スレッドの状態を記述する値です。

スレッドの状態とメソッドの詳細については、「スレッド状態」を参照してください。

各スレッドには、実行するプロセッサ時間のスライスの大小を指定する Priority プロパティがあります。オペレーティング システムは、優先順位の高いスレッドに長いタイム スライスを割り当て、優先順位の低いスレッドに短いスライスを割り当てます。新しいスレッドは Normal 値で作成されますが、Priority プロパティは ThreadPriority 列挙の任意の値に変更できます。

さまざまなスレッド優先順位の詳細については、「ThreadPriority」を参照してください。

フォアグラウンド スレッドは無期限に実行されますが、バックグラウンド スレッドは最後のフォアグラウンド スレッドが停止すると終了します。IsBackground プロパティを使用すると、スレッドのバックグラウンド ステータスを指定または変更できます。

コミュニティ コンテンツ   コミュニティ コンテンツとは
新しいコンテンツの追加 RSS  注釈
Processing
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker