49

私は以下を介してパラメータを渡そうとしています:

Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));

これを行う方法はありますか?助けていただければ幸いです

4

7 に答える 7

101

lazyberezovskyは正しい答えを持っています。技術的には、変数キャプチャにより、ラムダ式を使用して任意の数の引数を渡すことができることに注意してください。

var thread = new Thread(
       () => DoMethod(a, b, c));
thread.Start();

ThreadStartこれは、またはデリゲートに適合しないメソッドを呼び出す便利な方法ですParameterizedThreadStartが、親スレッドの引数を子スレッドのコードに渡した後で変更すると、データ競合が発生しやすいことに注意してください。

于 2012-12-08T11:32:16.713 に答える
39

オブジェクトを受け入れるオーバーロードThread.Startされたメソッドを使用します(複数のパラメーターが必要な場合は、カスタムタイプまたは配列を渡すことができます)。

Foo parameter = // get parameter value
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
thread.Start(parameter);

そして、DoMethod単純に引数をパラメータタイプにキャストします。

private void DoMethod(object obj)
{
    Foo parameter = (Foo)obj;
    // ...    
}

ところで、.NET 4.0以降では、タスクを使用できます(競合状態にも注意してください)。

Task.Factory.StartNew(() => DoMethod(a, b, c));
于 2012-12-08T11:04:45.993 に答える
0
// Parameters to pass to ParameterizedThreadStart delegate
// - in this example, it's an Int32 and a String:
class MyParams
{
    public int A { get; set; }
    public string B { get; set; }

    // Constructor
    public MyParams(int someInt, string someString)
    {
        A = someInt;
        B = someString;
    }
}

class MainClass
{
    MyParams ap = new MyParams(10, "Hello!");
    Thread t = new Thread(new ParameterizedThreadStart(DoMethod));
    t.Start(ap); // Pass parameters when starting the thread
}
于 2014-08-11T19:47:47.107 に答える