Я пытаюсь передать параметры через следующее:
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
Есть идеи, как это сделать? Я был бы признателен за помощь
Я пытаюсь передать параметры через следующее:
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
Есть идеи, как это сделать? Я был бы признателен за помощь
lazyberezovsky имеет правильный ответ. Я хочу отметить, что технически вы можете передать произвольное количество аргументов, используя lambda-выражение из-за захвата переменной:
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;
// ...
}
BTW в .NET 4.0 и выше вы можете использовать задачи (также будьте осторожны с условиями гонки):
Task.Factory.StartNew(() => DoMethod(a, b, c));
Другой способ архивирования, который вы хотите, - это вернуть делегат внутри вашей функции/метода. Возьмем следующий пример:
class App
{
public static void Main()
{
Thread t = new Thread(DoWork(a, b));
t.Start();
if (t.IsAlive)
{
t.IsBackground = true;
}
}
private static ThreadStart DoWork(int a, int b)
{
return () => { /*DoWork*/ var c = a + b; };
}
}
new Thread(() => { DoMethod(a, b, c); }).Start();
или
new Thread(() => DoMethod(a, b, c)).Start();
Вместо создания класса для передачи нескольких параметров, как это сделал @user1958681, вы можете использовать анонимные типы, а затем просто использовать динамическую типизацию для извлечения параметров.
class MainClass
{
int A = 1;
string B = "Test";
Thread ActionThread = new Thread(new ParameterizedThreadStart(DoWork));
ActionThread.Start(new { A, B});
}
Тогда в DoWork
private static void DoWork(object parameters)
{
dynamic d = parameters;
int a = d.A;
string b = d.B;
}
// Parameters to pass to ParameterizedThreadStart delegate
// - in this example, it 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
}