2010-07-29 19 views
226

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

Supongamos que tengo 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 de tipo método de lo esperado.

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

+2

Salida [esto] (http: //www.yoda.arachsys.com/csharp/hilos /) artículo escrito por Jon Skeet La sección de Parámetros está en la página siguiente, pero el artículo en su conjunto es una lectura bastante buena. – codingbadger

Respuesta

570

La más sencilla es simplemente

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

La ventaja (s) de este (más ParameterizedThreadStart) es que se puede pasar varios parámetros, y se obtiene en tiempo de compilación comprobar sin necesidad de echar de object todo el tiempo .

+14

Disculpe por el offtopic, pero ¿qué significa el operador '()'? Lo veo a veces, pero no tengo tiempo para comprobarlo. –

+21

Es una expresión lambda sin argumentos. – Noldorin

+29

@ ŁukaszW.pl - lo que dijo Noldorin; p en C# 2.0 una construcción alternativa (para este ejemplo) es 'new Thread (delegate() {download (filename);});' –

20

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

Ejemplo:

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

thread.Start(filename) 
28

vistazo a este ejemplo:

public void RunWorker() 
{ 
    Thread newThread = new Thread(WorkerMethod); 
    newThread.Start(ParameterObject); 
} 

public void WorkerMethod(object parameterObject) 
{ 
    // do your job! 
} 

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

Así que en su caso se debe utilizar de esta manera:

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

Pero su método de 'descarga' todavía tiene que tomar objeto, no cadena como parámetro. Puedes convertirlo a cadena en tu cuerpo de método.

+3

¿Realmente funciona? – Mukus

+1

No está en mi opinión. –

4

Usted también podría delegate así ...

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

¿Qué tal esto: (¿o es aceptable utilizar como éste)

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

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

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); 
+0

Me gusta mucho este enfoque, encontré que el enfoque de la expresión lambda no siempre es el seguimiento de los parámetros correctos – meanbunny

0

aquí es 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); 
} 
1

En adicional

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