Como passar parâmetros para o método ThreadStart no Thread?

Como passar parâmetros para o método Thread.ThreadStart() em C #?

Suponha que eu tenha chamado o método ‘download’

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

Agora eu criei um thread no método principal:

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

tipo de método de erro esperado.

Como posso passar parâmetros para ThreadStart com método de destino com parâmetros?

O mais simples é apenas

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

A (s) vantagem (s) desta (sobre ParameterizedThreadStart ) é que você pode passar múltiplos parâmetros, e você obtém checagem em tempo de compilation sem precisar lançar do object o tempo todo.

Veja este exemplo:

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

Você está criando primeiro um segmento passando o método delegate para worker e, em seguida, inicia-o com um método Thread.Start que considera seu object como parâmetro.

Então, no seu caso, você deve usá-lo assim:

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

Mas o seu método ‘download’ ainda precisa pegar o object , e não string como parâmetro. Você pode convertê-lo para string no corpo do seu método.

Você deseja usar o delegado ParameterizedThreadStart para methods de thread que usam parâmetros. (Ou nenhum, na verdade, e deixe o construtor Thread inferir.)

Exemplo de uso:

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

Você também pode delegate como assim …

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

Você pode encapsular a function thread (download) e os parâmetros necessários (filename) em uma class e usar o delegado ThreadStart para executar a function 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); 

Em adicional

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

Que tal isso: (ou está tudo bem em usar assim?)

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

aqui é o caminho perfeito …

 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); }