线程 vs 线程启动

32

在C#中,实际上,我没有观察到以下内容之间的任何区别:

new Thread(SomeMethod).Start();
new Thread(new ParameterizedThreadStart(SomeMethod));

new Thread(new ThreadStart(SomeMethod));

有没有任何区别?如果有,是什么区别?

3个回答

47

Thread(ThreadStart) 构造函数只能在您的 SomeMethod 方法的签名与 ThreadStart 委托匹配时使用。相反,Thread(ParameterizedThreadStart) 要求 SomeMethod 匹配 ParameterizedThreadStart 委托。签名如下:

public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)

具体而言,这意味着当您的方法不需要任何参数时,应使用 ThreadStart,而当它需要单个 Object 参数时,应使用 ParameterizedThreadStart。使用前者创建的线程应通过调用 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}\"!");
}

最后,你可以调用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");

11

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的参数,否则它就不匹配这个委托类型。


2
不是的,但是如果你在一个地方创建ThreadStart对象,在另一个地方启动新线程,你的代码看起来会更加简洁清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接