32

BackgroundWorker オブジェクトを使用すると、単一の引数を DoWorkEventHandler に渡すことができます。

// setup/init:
BackgroundWorker endCallWorker = new BackgroundWorker();
endCallWorker.DoWork += new DoWorkEventHandler(EndCallWorker_DoWork);
...
endCallWorker.RunWorkerAsync(userName);

// the handler:
private void EndCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string userName = e.Argument as string;
    ...
}

複数の引数を渡すには、次の貧弱な文字列配列のように、それらをオブジェクトでラップする必要があります。

// setup/init:

BackgroundWorker startCallWorker = new BackgroundWorker();
startCallWorker.DoWork += new DoWorkEventHandler(StartCallWorker_DoWork);
...
startCallWorker.RunWorkerAsync(new string[]{userName, targetNumber});


// the handler:
private void StartCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string[] args = e.Argument as string[];
    string userName = args[0];
    string targetNumber = args[1];
}

複数の引数を適切に渡すことを可能にする、または理想的には独自の署名を書くことを可能にする別のオブジェクトまたはパターンはありますか?

4

7 に答える 7

45

クロージャー (Lambda) を使用できます。

backgroundWorker.DoWork += (s, e) => MyWorkMethod(userName, targetNumber);

またはデリゲート (匿名メソッド) 構文を使用する場合:

backgroundWorker.DoWork += 
    delegate(object sender, DoWorkEventArgs e)
    {
        MyWorkMethod(userName, targetNumber);
    };
于 2009-07-17T21:33:30.100 に答える
12

型付きオブジェクトを使用することの何が問題になっていますか?

internal class UserArgs
{
    internal string UserName { get; set; }
    internal string TargetNumber { get; set; }
}

var args = new UserArgs() {UserName="Me", TargetNumber="123" };
startCallWorker.RunWorkerAsync(args);
于 2009-07-17T21:46:06.750 に答える
4

型付きオブジェクトの代わりに。C# 4.0 はタプルを提供します。タプルを使用して複数の引数を保持できます。その後、新しいクラスを宣言する必要はありません。

于 2011-06-14T11:31:43.467 に答える
3

オブジェクトは、リストまたは配列などにすることができます。オブジェクトをある種のコンテナにしてから、BackgroundWorker 内でキャストするだけです。ただし、常に同じ型を渡すようにする必要があります。

于 2009-07-17T21:40:36.137 に答える
2

オブジェクトとしてラムダ関数を渡すことはありますか? 次に、DoWork ハンドラーで呼び出します。

endCallWorker.RunWorkerAsync(new Action( () => DelegatedCallTarget(userName, targetNumber) ));
于 2009-07-17T21:33:57.023 に答える
1

すべての引数を保持するクラスを作成します

Class MyClass
{
     private string m_Username = string.Empty;
     private int m_Targetnumber;

     public MyClass(){}

     public string Username
     {
         get { return m_Username; }
         set { m_Username = value; }
     }

     public int TargetNumber
     {
         get { return m_TargetNumber; }
         set { m_TargetNumber = value; }
     }
 }



// setup/init:

BackgroundWorker startCallWorker = new BackgroundWorker();
startCallWorker.DoWork += new DoWorkEventHandler(StartCallWorker_DoWork);
...

MyClass thisClass = new MyClass();
thisClass.Username = "abcd";
thisClass.TargetNumber = 1234;
startCallWorker.RunWorkerAsync(thisClass);


// the handler:
private void StartCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
     MyClass args = (MyClass)e.Argument;
     string userName = args.Username;
     string targetNumber = args.TargetNumber;
}
于 2011-10-25T09:56:01.867 に答える
0

パラメータの配列として渡される「1つの」オブジェクトを持たないのはなぜですか? object パラメーターからメソッド内の配列にキャストするだけで済みます。

于 2009-07-17T21:31:49.493 に答える