如何将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();