为什么.Net没有Thread.Start()的通用版本?我想知道为什么.Net没有启动线程的通用方法。比如我们这样启动一个线程....Threadth=newThread(SayHello);th.Start("你好");privatestaticvoidSayHello(objectobj){stringstr=objasstring;控制台.WriteLine(海峡);为什么我们不能,我的意思是.Net团队不认为它是通用的?以下...Threadth=newThread(SayHello);因为很多时候我将值类型传递给线程启动我必须进行装箱/拆箱。我可以看到实现BCL的人不愿意写这样的东西的几个原因:如果您担心性能,转换(即使它是未装箱的)将比实际创建线程小得多。如果您担心类型安全,可以轻松使用lambda:newThread(()=>SayHello("Hello"))。Thread将是一个令人困惑的类型,因为它不清楚T代表什么。特别是因为它与任务T具有完全不同的含义。如果需要,第20行可用于创建一个线程作为包装器(见下文)。因此,如果它确实困扰您并且解决方案可能令人困惑,那么问题很小并且很容易解决。这可能就是为什么资源不花钱来实现这一目标的原因。线程可以实现:classThread{privatereadonlyActionm_action;私有只读线程m_thread;私有Tm_parameter;publicThread(Actionaction){m_action=action;m_thread=新线程(DoWork);}publicvoidStart(Tparameter){m_parameter=parameter;m_thread.Start();}privatevoidDoWork(){m_action(m_parameter);因为还没有人写过那个方法。另外,由于这里的装箱/拆箱只是整体操作的一小部分,很少有程序员需要手动启动线程(对于大多数用例有更好的抽象),他们可能看不到指定的、实现的、测试的和根据需要提供文档。一个很大程度上不受欢迎的变化。使用lambda启动线程很容易使用强类型,所以他们不需要为它添加任何新的语言支持。例如:使用系统;使用系统线程;classProgram{staticvoidMain(string[]args){//使用强类型多个参数启动线程的简单方法:newThread(()=>MyThreadFunc("Test",42,DateTime.Now)).Start();Console.WriteLine("开始线程。");线程.睡眠(2000);}staticvoidMyThreadFunc(stringparam1,intparam2,DateTimeparam3){Thread.Sleep(1000);Console.WriteLine("param1={0},param2={1},param3={2}",param1,param2,param3);}}.net里面有很多类,如果是引入泛型以后设计的话,估计会有泛型的版本。线程只是其中之一。对于此特定问题,如果您可以使用.net4.0+:使用System.Threading.Tasks命名空间中的任务类。privatestaticvoidSayHello(strings){Taskt=newTask(()=>Console.WriteLine(s));t.开始();这个例子是类型安全的并且是你的例子。方法是不同的,如果你期待一个结果,任务确实更有意义,但仍然是一个很好的替代品,我认为即使在这里。我的猜测是MS不会将工作放在“旧”Thread类中,但可能会继续改进任务并行库。由于“历史原因”。该方法是在.NET1(没有泛型)中创建的,此后一直没有修复。与ICloneable等一样Weird..没有人真正问过为什么有人会想做OP要求的事情。线程旨在运行一段代码。线程不是方法。从.NET中泛型的本质来看,代码newThread()意味着创建一个特定类型的对象——字符串。这无论如何与Thread类运行一段时间并做一些事情的目的有关。复杂的东西。为了说明我的想法——正如他所问的——为什么我们不拥有带电视和XBOX的压路机……我所有的答案——这没有实现,因为它与.NET的体系结构相矛盾……即*错误*它不是因为他们没有打扰。以上是C#学习教程:为什么.Net中没有通用版的Thread.Start()?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
