¿Cómo pasar parámetros al método ThreadStart en Thread?

¿Cómo pasar parámetros al método Thread.ThreadStart() en C #?

Supongamos que tengo un método llamado ‘descargar’

 public void download(string filename) { // download code } 

Ahora he creado un hilo en el método principal:

 Thread thread = new Thread(new ThreadStart(download(filename)); 

error método tipo esperado.

¿Cómo puedo pasar parámetros a ThreadStart con el método de destino con parámetros?

Lo más simple es solo

 string filename = ... Thread thread = new Thread(() => download(filename)); thread.Start(); 

La (s) ventaja (s) de esto (en ParameterizedThreadStart ) es que puede pasar múltiples parámetros, y obtiene la verificación en tiempo de comstackción sin necesidad de lanzar desde el object todo el tiempo.

Mira este ejemplo:

 public void RunWorker() { Thread newThread = new Thread(WorkerMethod); newThread.Start(ParameterObject); } public void WorkerMethod(object parameterObject) { // do your job! } 

Primero está creando un hilo pasando el delegado al método de trabajador y luego lo inicia con un método Thread.Start que toma su objeto como parámetro.

Entonces en tu caso deberías usarlo así:

  Thread thread = new Thread(download); thread .Start(filename); 

Pero su método de ‘descarga’ todavía necesita tomar el objeto , no la cadena como parámetro. Puedes convertirlo a cadena en tu cuerpo de método.

Desea utilizar el delegado ParameterizedThreadStart para los métodos de subprocesos que toman los parámetros. (O nada en realidad, y deje que el constructor de Thread inferir).

Ejemplo de uso:

 var thread = new Thread(new ParameterizedThreadStart(download)); //var thread = new Thread(download); // equivalent thread.Start(filename) 

También puedes delegate como …

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

Puede encapsular la función de subproceso (descargar) y los parámetros necesarios (nombre de archivo) en una clase y usar el delegado de ThreadStart para ejecutar la función de subproceso.

 public class Download { string _filename; Download(string filename) { _filename = filename; } public void download(string filename) { //download code } } Download = new Download(filename); Thread thread = new Thread(new ThreadStart(Download.download); 

En adicional

  Thread thread = new Thread(delegate() { download(i); }); thread.Start(); 

¿Qué tal esto: (o está bien usar esto?)

 var test = "Hello"; new Thread(new ThreadStart(() => { try { //Staff to do Console.WriteLine(test); } catch (Exception ex) { throw; } })).Start(); 

aquí está la manera perfecta …

 private void func_trd(String sender) { try { imgh.LoadImages_R_Randomiz(this, "01", groupBox, randomizerB.Value); // normal code ThreadStart ts = delegate { ExecuteInForeground(sender); }; Thread nt = new Thread(ts); nt.IsBackground = true; nt.Start(); } catch (Exception) { } } private void ExecuteInForeground(string name) { //whatever ur function MessageBox.Show(name); }