Подтвердить что ты не робот

Пропустить параметры через ParameterizedThreadStart

Я пытаюсь передать параметры через следующее:

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

Есть идеи, как это сделать? Я был бы признателен за помощь

4b9b3361

Ответ 1

lazyberezovsky имеет правильный ответ. Я хочу отметить, что технически вы можете передать произвольное количество аргументов, используя lambda-выражение из-за захвата переменной:

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

Это удобный способ вызова методов, которые не соответствуют делегату ThreadStart или ParameterizedThreadStart, но будьте осторожны, что вы можете легко вызвать гонку данных, если вы измените аргументы в родительском потоке после их передачи код дочернего потока.

Ответ 2

Использовать перегруженный метод 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));

Ответ 3

Другой способ архивирования, который вы хотите, - это вернуть делегат внутри вашей функции/метода. Возьмем следующий пример:

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; };
  }

}

Ответ 4

new Thread(() => { DoMethod(a, b, c); }).Start();

или

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

Ответ 5

Вместо создания класса для передачи нескольких параметров, как это сделал @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;
 }

Ответ 6

// 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
}