私は以下を介してパラメータを渡そうとしています:
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
これを行う方法はありますか?助けていただければ幸いです
私は以下を介してパラメータを渡そうとしています:
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
これを行う方法はありますか?助けていただければ幸いです
lazyberezovskyは正しい答えを持っています。技術的には、変数キャプチャにより、ラムダ式を使用して任意の数の引数を渡すことができることに注意してください。
var thread = new Thread(
() => DoMethod(a, b, c));
thread.Start();
ThreadStart
これは、またはデリゲートに適合しないメソッドを呼び出す便利な方法ですParameterizedThreadStart
が、親スレッドの引数を子スレッドのコードに渡した後で変更すると、データ競合が発生しやすいことに注意してください。
オブジェクトを受け入れるオーバーロード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));
// 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
}