实际上,在C#中,我没有观察到以下内容之间的任何区别:
new Thread(SomeMethod).Start();,
new Thread(new ParameterizedThreadStart(SomeMethod));和
new Thread(new ThreadStart(SomeMethod));如果有的话,有什么不同?
发布于 2015-04-25 15:18:32
仅当SomeMethod方法的签名与ThreadStart委托匹配时,才能使用Thread(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}\"!");
}最后,可以在不指定ThreadStart或ParameterizedThreadStart委托的情况下调用Thread构造函数。在这种情况下,编译器将根据其签名将您的方法与构造函数重载相匹配,从而隐式执行强制转换。
var threadA = new Thread(ExecuteA); // implicit cast to ThreadStart
threadA.Start();
var threadB = new Thread(ExecuteB); // implicit cast to ParameterizedThreadStart
threadB.Start("abc");发布于 2015-04-25 15:26:49
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类型的参数,否则它与此委托类型不匹配。
发布于 2015-04-25 15:18:13
不会,但是如果您在一个地方创建ThreadStart对象,然后在另一个地方启动新线程,那么很多时候您的代码看起来会好很多。
https://stackoverflow.com/questions/29862234
复制相似问题