如何创建一个线程?

时间:2009-05-01 12:52:42

标签: c# multithreading

以下方法是我想在该主题中完成的工作:

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

两者都不编译,怎么做?

4 个答案:

答案 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方法。