Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建线程?_C#_Multithreading - Fatal编程技术网

C# 如何创建线程?

C# 如何创建线程?,c#,multithreading,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(Sta

下面的方法是我希望在该线程中执行的操作:

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

两者都不编译,如何编译?

要运行的方法必须是一个。请参考MSDN上的。注意,您可以从闭包开始创建两个参数。比如:

var t = new Thread(() => Startup(port, path));
请注意,您可能希望重新访问方法的可访问性。如果我看到一个类以这种方式在自己的公共方法上启动线程,我会有点惊讶

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

使用端口和路径对象创建一个对象,并将其传递给启动方法。

以下方法有效

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

您的示例失败,因为线程方法要么使用一个参数,要么使用零个参数。要在不传递参数的情况下创建线程,代码如下所示:

void Start()
{
    // do stuff
}

void Test()
{
    new Thread(new ThreadStart(Start)).Start();
}
Task.Factory.StartNew(() => 
{
    // Whatever code you want in your thread
});
如果要将数据传递给线程,则需要将数据封装到单个对象中,无论该对象是您自己设计的自定义类,还是字典对象或其他对象。然后需要使用ParameterizedThreadStart委托,如下所示:

void Start(object data)
{
    MyClass myData = (MyClass)myData;
    // do stuff
}

void Test(MyClass data)
{
    new Thread(new ParameterizedThreadStart(Start)).Start(data);
}
更新 当前建议的启动任务的方法是简单地使用Task.Run()

请注意,此方法被描述为启动任务的最佳方式

先前的答案

我喜欢System.Threading.Tasks中的任务工厂。您可以这样做:

void Start()
{
    // do stuff
}

void Test()
{
    new Thread(new ThreadStart(Start)).Start();
}
Task.Factory.StartNew(() => 
{
    // Whatever code you want in your thread
});
请注意,任务工厂为您提供了其他方便选项,如ContinueWith:


还要注意,任务与线程的概念略有不同。它们与async/await关键字非常匹配,请参见。

不起作用或无法编译?您应该指定使用的语言,这样我(我们)就不必猜测了。也就是说,什么不起作用就好了。检查问题标签-C#它不编译。语言在标签中有说明。:)我试过了,没用。ThreadStart t=新的ThreadStart(启动);启动需要两个参数。如果检查我链接的文档,ThreadStart不接受任何参数。我们可以使用闭包作弊,使其看起来像两个(在3.5中),或者我们可以使用ParameterizedThreadStart并将这两个参数捆绑到一个对象中(3.5之前)。就在我写第一行时,我得到了“没有重载的‘Startup’匹配委托’系统。Threading.ParameterizedThreadStart”启动需要是“void Startup(object parameters)”。不能使用“void Startup(threadParameters参数)”,因为不能将对象传递给该对象。您可以在启动内部将对象参数强制转换为ThreadParameter。您必须更改启动方法的符号以接受ThreadParameter类…(使用2个参数创建的类)。实际上,您必须进行启动签名才能接收对象,当您进入方法时,将其转换为ThreadParameter对象。使用“旧方法”时,我会遇到错误,但lamba表达式工作正常。:)澄清了所需的启动方法签名。很好-我只是用“旧”的方式在下面发布了一个答案,但没有意识到可以使用lambda表达式创建更干净的线程入口点。@John:我强烈建议您理解为什么事情会起作用和不起作用。我觉得你在这里复制/粘贴,这对你自己和你的客户都是一个很大的伤害。@Mikko:甚至你的“老办法”都是使用C#3.0初始化ThreadParams属性的功能:-)。