ThreadStart con parámetros

¿Cómo se inicia un hilo con parámetros en C #?

Sip:

Thread t = new Thread (new ParameterizedThreadStart(myMethod)); t.Start (myParameterObject); 

Una de las 2 sobrecargas del constructor de subprocesos toma un delegado ParameterizedThreadStart que le permite pasar un solo parámetro al método de inicio. Desafortunadamente, solo permite un único parámetro y lo hace de una manera insegura porque lo pasa como un objeto. Encuentro que es mucho más fácil usar una expresión lambda para capturar los parámetros relevantes y pasarlos de una manera fuertemente tipada.

Pruebe lo siguiente

 public Thread StartTheThread(SomeType param1, SomeOtherType param2) { var t = new Thread(() => RealStart(param1, param2)); t.Start(); return t; } private static void RealStart(SomeType param1, SomeOtherType param2) { ... } 

Puedes usar expresiones lambda

 private void MyMethod(string param1,int param2) { //do stuff } Thread myNewThread = new Thread(() => MyMethod("param1",5)); myNewThread.Start(); 

esta es hasta ahora la mejor respuesta que pude encontrar, es rápido y fácil.

 Thread thread = new Thread(Work); thread.Start(Parameter); private void Work(object param) { string Parameter = (string)param; } 

El tipo de parámetro debe ser un objeto.

EDITAR:

Si bien esta respuesta no es incorrecta, lo recomiendo en contra de este enfoque. Usar una expresión lambda es mucho más fácil de leer y no requiere conversión de tipo. Vea aquí: https://stackoverflow.com/a/1195915/52551

 class Program { static void Main(string[] args) { Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod)); t.Start("My Parameter"); } static void ThreadMethod(object parameter) { // parameter equals to "My Parameter" } } 

Manera simple de usar lambda como tal ..

 Thread t = new Thread(() => DoSomething("param1", "param2")); t.Start(); 

O incluso podrías delegate usando ThreadStart como tal …

 ThreadStart ts = delegate { bool moreWork = DoWork("param1", "param2", "param3"); if (moreWork) { DoMoreWork("param1", "param2"); } }; new Thread(ts).Start(); 

Use ParameterizedThreadStart .

Use ParametrizedThreadStart .

Estaba teniendo problemas en el parámetro pasado. Pasé el entero de un bucle for a la función y lo visualicé, pero siempre dio resultados diferentes. como (1,2,2,3) (1,2,3,3) (1,1,2,3) etc. con el delegado ParametrizedThreadStart .

este código simple funcionó como un encanto

 Thread thread = new Thread(Work); thread.Start(Parameter); private void Work(object param) { string Parameter = (string)param; } 

ParameterizedThreadStart toma un parámetro. Puede usar eso para enviar un parámetro o una clase personalizada que contenga varias propiedades.

Otro método es poner el método que desea iniciar como un miembro de instancia en una clase junto con las propiedades para los parámetros que desea establecer. Cree una instancia de la clase, configure las propiedades e inicie el hilo especificando la instancia y el método, y el método puede acceder a las propiedades.

Puede usar un delegado ParametrizedThreadStart :

 string parameter = "Hello world!"; Thread t = new Thread(new ParameterizedThreadStart(MyMethod)); t.Start(parameter); 

Puede utilizar el método BackgroundWorker RunWorkerAsync y pasar su valor.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApp6 { class Program { static void Main(string[] args) { int x = 10; Thread t1 =new Thread(new ParameterizedThreadStart(order1)); t1.IsBackground = true;//i can stope t1.Start(x); Thread t2=new Thread(order2); t2.Priority = ThreadPriority.Highest; t2.Start(); Console.ReadKey(); }//Main static void order1(object args) { int x = (int)args; for (int i = 0; i < x; i++) { Console.ForegroundColor = ConsoleColor.Green; Console.Write(i.ToString() + " "); } } static void order2() { for (int i = 100; i > 0; i--) { Console.ForegroundColor = ConsoleColor.Red; Console.Write(i.ToString() + " "); } }`enter code here` } } 
 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApp6 { class Program { static void Main(string[] args) { int x = 10; Thread t1 =new Thread(new ParameterizedThreadStart(order1)); t1.Start(x); Thread t2=new Thread(order2); t2.Priority = ThreadPriority.Highest; t2.Start(); Console.ReadKey(); }//Main static void order1(object args) { int x = (int)args; for (int i = 0; i < x; i++) { Console.ForegroundColor = ConsoleColor.Green; Console.Write(i.ToString() + " "); } } static void order2() { for (int i = 100; i > 0; i--) { Console.ForegroundColor = ConsoleColor.Red; Console.Write(i.ToString() + " "); } } } }