BackgroundWorker コンポーネントの概要BackgroundWorker Component Overview

一般的な操作には、実行時間が長くかかるものが数多くあります。There are many commonly performed operations that can take a long time to execute. 次に例を示します。For example:

  • イメージのダウンロードImage downloads

  • Web サービスの起動Web service invocations

  • ファイルのダウンロードとアップロード (ピアツーピア アプリケーションの場合を含む)File downloads and uploads (including for peer-to-peer applications)

  • ローカルでの複雑な計算Complex local computations

  • データベース トランザクションDatabase transactions

  • ローカル ディスク アクセス (前提としてメモリ アクセスに比べて低速です)Local disk access, given its slow speed relative to memory access

これらの操作を実行すると、ユーザーインターフェイスが実行中にブロックされる可能性があります。Operations like these can cause your user interface to block while they are running. 応答性に優れた UI を必要としながらも、このような操作との関連で長時間の遅延に直面する場合は、BackgroundWorker コンポーネントが便利なソリューションになります。When you want a responsive UI and you are faced with long delays associated with such operations, the BackgroundWorker component provides a convenient solution.

BackgroundWorker コンポーネントを使用すると、時間のかかる操作を、アプリケーションのメイン UI スレッドとは別のスレッドで非同期的に ("バックグラウンドで") 実行できます。The BackgroundWorker component gives you the ability to execute time-consuming operations asynchronously ("in the background"), on a thread different from your application's main UI thread. BackgroundWorker を使用するには、バックグラウンドで実行する、時間のかかるワーカー メソッドをこのコンポーネントに通知して、RunWorkerAsync メソッドを呼び出すだけです。To use a BackgroundWorker, you simply tell it what time-consuming worker method to execute in the background, and then you call the RunWorkerAsync method. 呼び出し元スレッドが正常に動作し続けると共に、ワーカー メソッドも非同期的に動作します。Your calling thread continues to run normally while the worker method runs asynchronously. このメソッドが終了すると、BackgroundWorker は、RunWorkerCompleted イベントを起動して、呼び出し元スレッドに警告します。このイベントには、オプションで操作の結果を含めることもできます。When the method is finished, the BackgroundWorker alerts the calling thread by firing the RunWorkerCompleted event, which optionally contains the results of the operation.

コンポーネントは、コンポーネント タブの ツールボックス から使用できます。 BackgroundWorkerBackgroundWorker をフォームに追加するには、BackgroundWorker コンポーネントをフォームにドラッグします。The BackgroundWorker component is available from the Toolbox, in the Components tab. To add a BackgroundWorker to your form, drag the BackgroundWorker component onto your form. コンポーネントトレイに表示され、プロパティが [プロパティ] ウィンドウに表示されます。It appears in the component tray, and its properties appear in the Properties window.

非同期操作を開始するには、RunWorkerAsync メソッドを使用します。To start your asynchronous operation, use the RunWorkerAsync method. RunWorkerAsync は、オプションの object パラメーターを受け取り、このパラメーターを使用してワーカー メソッドに引数を渡すことができます。RunWorkerAsync takes an optional object parameter, which can be used to pass arguments to your worker method. BackgroundWorker クラスは、DoWork イベントを公開します。このイベントには、DoWork イベント ハンドラー経由でワーカー スレッドをアタッチします。The BackgroundWorker class exposes the DoWork event, to which your worker thread is attached through a DoWork event handler.

DoWork イベント ハンドラーは、DoWorkEventArgs プロパティを持つ Argument パラメーターを受け取ります。The DoWork event handler takes a DoWorkEventArgs parameter, which has an Argument property. このプロパティは、RunWorkerAsync からパラメーターを受け取り、DoWork イベント ハンドラーで呼び出されるワーカー メソッドに渡されます。This property receives the parameter from RunWorkerAsync and can be passed to your worker method, which will be called in the DoWork event handler. 次の例は、ComputeFibonacci というワーカー メソッドの結果を代入する方法を示しています。The following example shows how to assign a result from a worker method called ComputeFibonacci. これは大規模な例に含まれています。 詳細については、「」を参照してください。バックグラウンド操作を使用するフォームを実装します。It is part of a larger example, which you can find at How to: Implement a Form That Uses a Background Operation.

// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, 
    DoWorkEventArgs e)
{   
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub

イベントハンドラーの使用方法の詳細については、「イベント」を参照してください。For more information on using event handlers, see Events.

注意事項

どのような種類のマルチスレッドを使用している場合でも、非常に深刻で複雑なバグを引き起こしてしまう可能性があります。When using multithreading of any sort, you potentially expose yourself to very serious and complex bugs. マルチスレッドを使用するソリューションを実装する前に、「マネージド スレッド処理の実施」を参照してください。Consult the Managed Threading Best Practices before implementing any solution that uses multithreading.

クラスのBackgroundWorker使用方法の詳細については、「方法:バックグラウンドで操作を実行する」を参照してください。For more information on using the BackgroundWorker class, see How to: Run an Operation in the Background.

関連項目See also