以下方法是我想在该主题中完成的工作:
public void Startup(int port,string path)
{
Run(path);
CRCCheck2();
CRCCheck1();
InitializeCodeCave((ushort)port);
}
我尝试了我可以找到的谷歌搜索,但没有任何工作
public void Test(int port,string path)
{
Thread t = new Thread(Startup(port,path));
}
public void TestA(int port,string path)
{
Thread t = new Thread(Startup);
t.Start (port,path);
}
两者都不编译,怎么做?
答案 0 :(得分:71)
以下方式有效。
// The old way of using ParameterizedThreadStart. This requires a
// method which takes ONE object as the parameter so you need to
// encapsulate the parameters inside one object.
Thread t = new Thread(new ParameterizedThreadStart(StartupA));
t.Start(new MyThreadParams(path, port));
// You can also use an anonymous delegate to do this.
Thread t2 = new Thread(delegate()
{
StartupB(port, path);
});
t2.Start();
// Or lambda expressions if you are using C# 3.0
Thread t3 = new Thread(() => StartupB(port, path));
t3.Start();
启动方法对这些示例有以下签名。
public void StartupA(object parameters);
public void StartupB(int port, string path);
答案 1 :(得分:8)
您要运行的方法必须是ThreadStart
Delegate。请参阅MSDN上的Thread
documentation。请注意,您可以使用闭包创建双参数start。类似的东西:
var t = new Thread(() => Startup(port, path));
请注意,您可能需要重新访问方法辅助功能。如果我看到一个类以这种方式在自己的公共方法上开始一个线程,我会有点惊讶。
答案 2 :(得分:4)
您的示例失败,因为Thread方法采用一个或零参数。要在不传递参数的情况下创建线程,您的代码如下所示:
void Start()
{
// do stuff
}
void Test()
{
new Thread(new ThreadStart(Start)).Start();
}
如果要将数据传递给线程,则需要将数据封装到单个对象中,无论是您自己设计的自定义类,还是字典对象或其他对象。然后,您需要使用 ParameterizedThreadStart 委托,如下所示:
void Start(object data)
{
MyClass myData = (MyClass)myData;
// do stuff
}
void Test(MyClass data)
{
new Thread(new ParameterizedThreadStart(Start)).Start(data);
}
答案 3 :(得分:2)
public class ThreadParameter
{
public int Port { get; set; }
public string Path { get; set; }
}
Thread t = new Thread(new ParameterizedThreadStart(Startup));
t.Start(new ThreadParameter() { Port = port, Path = path});
使用port和path对象创建一个对象,并将其传递给Startup方法。