如何将parameter passing给线程中的ThreadStart方法?

如何将parameter passing给C#中的Thread.ThreadStart()方法?

假设我有一种叫做“下载”的方法

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

现在我在主要方法中创build了一个线程:

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

预期的错误方法types。

如何使用参数的目标方法将parameter passing给ThreadStart

最简单的就是

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

这个(通过ParameterizedThreadStart )的好处是你可以传递多个参数,并且你可以在不需要一直投射object情况下进行编译时检查。

看看这个例子:

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

您首先通过将委托传递给工作方法来创build一个线程,然后使用将对象作为参数的Thread.Start方法启动它。

所以在你的情况下,你应该像这样使用它:

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

但是你的“下载”方法仍然需要把对象 ,而不是string作为参数。 你可以将它强制转换为方法体中的string。

您希望使用ParameterizedThreadStart委托来获取参数的线程方法。 (或者根本没有,并且让Thread构造函数推断出来。)

用法示例:

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

你也可以像这样delegate

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

您可以将线程函数(下载)和所需参数(文件名)封装到一个类中,并使用ThreadStart委托来执行线程函数。

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

这样怎么样:(或者可以这样使用吗?)

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

这里是完美的方式…

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

另外的

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