2010-07-29 19 views
226

Come passare i parametri al metodo Thread.ThreadStart() in C#?Come passare parametri al metodo ThreadStart in Thread?

Supponiamo che io abbia metodo chiamato 'download'

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

Ora ho creato un thread nel metodo principale:

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

errore tipo di metodo previsto.

Come posso passare parametri a ThreadStart con metodo di destinazione con i parametri?

+2

Partenza [Questo] (http: //www.yoda.arachsys.com/csharp/threads /) articolo scritto da Jon Skeet La sezione Parametri si trova nella pagina successiva ma l'articolo nel suo complesso è una buona lettura. – codingbadger

risposta

570

Il più semplice è solo

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

Il vantaggio (s) di questo (oltre ParameterizedThreadStart) è che si può passare più parametri, e si ottiene in fase di compilazione senza la necessità di lanciare dal object tutto il tempo .

+14

Mi dispiace per l'estetica ma cosa significa "()" operatore? Lo vedo a volte ma non ho tempo per controllare. –

+21

È un'espressione lambda senza argomenti. – Noldorin

+29

@ ŁukaszW.pl - cosa ha detto Noldorin; p in C# 2.0 un costrutto alternativo (per questo esempio) è 'new Thread (delegate() {download (filename);});' –

20

Si desidera utilizzare il delegato ParameterizedThreadStart per i metodi di thread che accettano parametri. (O del tutto assenti in realtà, e lasciare che l'infer Thread costruttore.) Utilizzo

Esempio:

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

thread.Start(filename) 
28

Guardate questo esempio:

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

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

Si sono prima creazione di un thread passando delegato al metodo worker e quindi lo avvia con un metodo Thread.Start che prende l'oggetto come parametro.

Quindi nel tuo caso si dovrebbe usare in questo modo:

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

Ma il metodo di 'scaricare' ha ancora bisogno di prendere oggetto, non stringa come parametro. Puoi lanciarlo su una stringa nel tuo corpo del metodo.

+3

Funziona davvero? – Mukus

+1

Non nei miei tentativi. –

4

Si potrebbe anche delegate in questo modo ...

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

ne dite di questo: (? O è ok per l'uso come questo)

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

È possibile incapsulare la funzione di filo (download) e il parametro necessario (s) (nome file) in una classe e utilizzare il delegato ThreadStart per eseguire la funzione thread.

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

Mi piace molto questo approccio, ho trovato che l'approccio espressione lambda non tiene sempre traccia dei parametri giusti – meanbunny

0

qui è il modo perfetto ...

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

In Ulteriori

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