Запуск параметризованного метода в потоке

#c# #multithreading #parameters

#c# #многопоточность #параметры

Вопрос:

В настоящее время я работаю над проектом на c #, и мне нужен метод, который имеет 1 параметр для запуска в качестве потока.

Например.

     public void myMethod(string path)
    {
       int i = 0;
       while (i != 0)
       {
          Console.WriteLine("Number: "   i);
          i  ;
       }
    }
  

Как я могу вызвать вышеупомянутый метод из другого метода, но работающего внутри потока.

Спасибо за любую помощь, которую вы можете предоставить.

Ответ №1:

Обычно самый простой способ — использовать анонимный метод или лямбда-выражение:

 string path = ...;

Thread thread = new Thread(() => MyMethod(path));
thread.Start();
  

Вы можете использовать a ParameterizedThreadStart , но я обычно не стал бы.

Обратите внимание, что если вы делаете это в цикле, вам нужно знать о нормальной опасности «закрытия переменной цикла»:

 // Bad
foreach (string path in list)
{
    Thread thread = new Thread(() => MyMethod(path));
    thread.Start();
}

// Good
foreach (string path in list)
{
    string copy = path;
    Thread thread = new Thread(() => MyMethod(copy));
    thread.Start();
}
  

Комментарии:

1. Спасибо, отлично сработало. Было на удивление сложно найти ответ на этот вопрос с помощью Google, намного проще, чем способ, который я нашел в Google, который, похоже, работал не слишком хорошо, еще раз спасибо

Ответ №2:

 new Thread(o => myMethod((string)o)).Start(param);
  

Ответ №3:

Просто оберните этот вызов метода в метод, который не принимает параметров, но который вызывает ваш метод с правильным параметром.

 public void myWrappingMethod()
{
    myMethod(this.Path);
}

public void myMethod(string path)
{
    // ...
}
  

Или, если у вас есть доступные лямбды, просто используйте один из них (согласно ответу Джона Скита).