web-dev-qa-db-ja.com

パラメーターを使用した基本的なBackgroundWorkerの使用法

バックグラウンドスレッドで実行したい、プロセス集約型のメソッド呼び出しは次のようになります。

object.Method(paramObj, paramObj2);

これら3つのオブジェクトはすべて、私が作成したものです。これで、私が見た最初の例から、オブジェクトをバックグラウンドワーカーのDoWorkメソッドに渡すことができます。しかし、ここで行っているように、そのオブジェクトに追加のパラメーターを渡す必要がある場合、どうすればよいですか?これを単一のオブジェクトにラップしてそれで終了することもできますが、これについて他の誰かの入力を取得するのが賢明だと思いました。

20
Chris

RunWorkerAsync呼び出しのオブジェクト引数に任意のオブジェクトを渡し、DoWorkイベント内から引数を取得できます。 DoWorkEventArgsのResult変数を使用して、DoWorkイベントからRunWorkerCompletedイベントに引数を渡すこともできます。

    public Form1()
    {
        InitializeComponent();

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

        object paramObj = 1;
        object paramObj2 = 2;

        // The parameters you want to pass to the do work event of the background worker.
        object[] parameters = new object [] { paramObj, paramObj2 };

        // This runs the event on new background worker thread.
        worker.RunWorkerAsync(parameters);
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        object[] parameters = e.Argument as object[];

        // do something.

        e.Result = true;
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        object result = e.Result;

        // Handle what to do when complete.                        
    }
54
mservidio

私の頭に浮かぶ最も簡単な方法は、所有するすべてのオブジェクトのプロパティを持つクラスを作成し、それを渡すことです。

public class MyWorkerContext
{
   public Object1 Worker;
   public Object2 Parameter1;
   public Object2 Parameter2;
}

その後、DoWorkで次のようなことを行うだけです。

MyWorkerContext context = e.Argument as MyWorkerContext;

context.Worker.Method(context.Parameter1, context.Parameter2);
10
LazyOfT

DoWorkのラムダでそれらをキャプチャできます。

_bgw.DoWork += (sender, e) => object.Method(paramObj, paramObj2) ;
_

_e.Argument_(つまり、BackgroundWorker.RunWorkerAsync()に渡される状態値またはオブジェクト)は、3のうちの1つである可能性がありますが、タイプ_System.Object_であり、ボックス化が必要です。すべてのパラメーターをラムダで直接渡すと、ボクシングやキャストを行う必要なく、すべてのパラメーターで完全な型保証が得られます。

6
Henk Holterman

オブジェクトをBackgroundWorker.RunWorkerAsync()メソッドに渡すことができます。 2つのparamObjsを1つのオブジェクトにラップし(配列、タプル、またはその他の複合クラスを使用できます)、それを引数としてRunWorkerAsync()に渡します。

次に、DoWorkイベントが発生したときに、イベントハンドラーのDoWorkEventArgsパラメーターのArgumentプロパティを調べることにより、この値を取得できます。

完全な例については、MSDNで確認してください: http://msdn.Microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=VS.90%29.aspx

1
NVade