首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程vs线程启动

线程vs线程启动
EN

Stack Overflow用户
提问于 2015-04-25 15:15:21
回答 3查看 25.4K关注 0票数 26

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

代码语言:javascript
复制
new Thread(SomeMethod).Start();

代码语言:javascript
复制
new Thread(new ParameterizedThreadStart(SomeMethod));

代码语言:javascript
复制
new Thread(new ThreadStart(SomeMethod));

如果有的话,有什么不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-25 15:18:32

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

代码语言:javascript
复制
public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)

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

代码语言:javascript
复制
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}\"!");
}

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

代码语言:javascript
复制
var threadA = new Thread(ExecuteA);   // implicit cast to ThreadStart
threadA.Start();

var threadB = new Thread(ExecuteB);   // implicit cast to ParameterizedThreadStart
threadB.Start("abc");
票数 41
EN

Stack Overflow用户

发布于 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类型的参数,否则它与此委托类型不匹配。

票数 9
EN

Stack Overflow用户

发布于 2015-04-25 15:18:13

不会,但是如果您在一个地方创建ThreadStart对象,然后在另一个地方启动新线程,那么很多时候您的代码看起来会好很多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29862234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档