线程与Threadstart

Sha*_*rma 19 .net c# multithreading

在C#中,实际上,我没有发现以下内容之间存在任何差异:

new Thread(SomeMethod).Start();
Run Code Online (Sandbox Code Playgroud)

,

new Thread(new ParameterizedThreadStart(SomeMethod));
Run Code Online (Sandbox Code Playgroud)

new Thread(new ThreadStart(SomeMethod));
Run Code Online (Sandbox Code Playgroud)

有什么区别,如果有的话?

Dou*_*las 29

Thread(ThreadStart)当你的签名构造只能用SomeMethod方法的匹配ThreadStart委托.相反,Thread(ParameterizedThreadStart)需要SomeMethod匹配ParameterizedThreadStart代表.签名如下:

public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)
Run Code Online (Sandbox Code Playgroud)

具体来说,这意味着您应该ThreadStart在方法不接受任何参数时使用,并且ParameterizedThreadStart当它采用单个Object参数时.使用前者创建的线程应该通过调用启动Start(),而使用后者创建的线程应该通过调用它们的参数Start(Object).

public static void Main(string[] args)
{
    var threadA = new Thread(new ThreadStart(ExecuteA));
    threadA.Start();

    var threadB = new Thread(new ParameterizedThreadStart(ExecuteB));
    threadB.Start("abc");

    threadA.Join();
    threadB.Join();
}

private static void ExecuteA()
{
    Console.WriteLine("Executing parameterless thread!");
}

private static void ExecuteB(Object obj)
{
    Console.WriteLine($"Executing thread with parameter \"{obj}\"!");
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以在Thread不指定ThreadStartParameterizedThreadStart委托的情况下调用构造函数.在这种情况下,编译器将根据其签名将您的方法与构造函数重载匹配,从而隐式执行转换.

var threadA = new Thread(ExecuteA);   // implicit cast to ThreadStart
threadA.Start();

var threadB = new Thread(ExecuteB);   // implicit cast to ParameterizedThreadStart
threadB.Start("abc");
Run Code Online (Sandbox Code Playgroud)


sta*_*ica 7

new Thread(SomeMethod)并且new Thread(new ThreadStart(SomeMethod)):

new Thread(SomeMethod)和之间的区别new Thread(new ThreadStart(SomeMethod))纯粹是语法:C#编译器为这些生成相同的代码; 前一版本是后者的缩写.

(编译器可以从可用Thread构造函数的签名和指定方法的签名中自动推导出要使用的正确委托类型SomeMethod.写出new ThreadStart(…)而不是仅仅有点像替换var某些表达式的实际类型,你是保护编译器找出实际类型的工作.)

这两个版本在SomeMethod不带参数时起作用,因为这是匹配ThreadStart委托所需的签名.

new Thread(new ParameterizedThreadStart(SomeMethod)):

上面两个之间的区别在于new Thread(new ParameterizedThreadStart(SomeMethod))这个是调用不同的构造函数Thread.

这取代ParameterizedThreadStart了不同的方法签名ThreadStart:您SomeMethod需要采用一个类型的参数object,否则它与该委托类型不匹配.