3

我想知道为什么.Net 没有启动线程的通用方法。

例如,我们启动一个线程,如下所示....

Thread th = new Thread(SayHello);
th.Start("Hello");

private static void SayHello(object obj)
        {
            string str = obj as string;
            Console.WriteLine(str);
        }

为什么我们不能拥有我的意思是为什么 .Net 团队不考虑使其通用?

类似于以下...

Thread<string> th = new Thread<string>(SayHello);

因为很多时候当我将值类型传递给线程启动时,我必须进行装箱/拆箱。

4

6 回答 6

4

我可以看到实现 BCL 的人不费心写这样的东西的几个原因:

  1. 如果您担心性能,那么演员表(即使是拆箱)将比实际创建线程的影响小得多。
  2. 如果您担心类型安全,可以轻松使用 lambda: new Thread(() => SayHello("Hello"))
  3. Thread<T>将是一个令人困惑的类型,因为尚不清楚它代表什么T。特别是因为它的含义与Tin完全不同Task<T>
  4. 如果你愿意,你可以Thread<T>使用 20 行来创建你的包装器(见下文)。

因此,如果它确实困扰您并且解决方案可能会令人困惑,那么这个问题很小并且很容易解决。这很可能是为什么没有花费资源来实现这一点的原因。


可能的实现Thread<T>

class Thread<T>
{
    private readonly Action<T> m_action;
    private readonly Thread m_thread;
    private T m_parameter;

    public Thread(Action<T> action)
    {
        m_action = action;
        m_thread = new Thread(DoWork);
    }

    public void Start(T parameter)
    {
        m_parameter = parameter;
        m_thread.Start();
    }

    private void DoWork()
    {
        m_action(m_parameter);
    }
}
于 2013-01-28T12:07:39.087 回答
2

使用 lambda 启动线程以使用强类型非常容易,因此他们不需要为其添加任何新的语言支持。

例如:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // Easy way to start a thread with strongly-typed multiple parameters:

        new Thread(() => MyThreadFunc("Test", 42, DateTime.Now)).Start();

        Console.WriteLine("Started thread.");
        Thread.Sleep(2000);
    }

    static void MyThreadFunc(string param1, int param2, DateTime param3)
    {
        Thread.Sleep(1000);
        Console.WriteLine("param1 = {0}, param2 = {1}, param3 = {2}", param1, param2, param3);
    }
}
于 2013-01-28T12:43:07.317 回答
2

因为还没有人写过那个方法。此外,由于这里的装箱/拆箱只是整个操作的一小部分,并且很少有程序员真正需要手动启动线程(大多数用例都有更好的抽象),他们可能认为几乎不需要指定、实现、测试和记录基本上不需要的更改。

于 2013-01-28T11:52:13.087 回答
1

.net 中有很多类,如果它们是在引入泛型之后设计的,我想它们会有一个泛型版本。线程只是其中之一。

对于这个特定问题,如果您可以使用 .net 4.0+:

使用System.Threading.Tasks命名空间中的 Task 类。

private static void SayHello(string s)
{
    Task t = new Task(() => Console.WriteLine(s));
    t.Start();
}

此示例是类型安全的,并且执行您的示例所做的操作。方法不同,如果您期待结果,Task 确实更有意义,但它仍然是一个很好的替代品,我认为即使在这里。我的猜测是 MS 不会将工作放在“旧”线程类中,但可能会继续改进Task Parallel Library

于 2013-01-28T11:52:15.473 回答
0

奇怪..实际上没有人问为什么有人想做OP要求的事情。线程旨在运行一段代码。线程不是方法。从 .NET 中泛型的性质来看,代码 new Thread() 将意味着创建具有特定类型的对象 - 字符串。无论如何,这与 Thread 类运行一段时间并做一些事情的目的无关。复杂的东西。

来说明我的想法——这就像他问的一样——为什么我们没有配备电视机和 XBOX 的压路机……

所以总而言之,我的答案 - 这没有实现,因为它与.NET的体系结构相矛盾。即*是错误的*而不是因为他们没有打扰。

于 2013-01-31T04:38:14.407 回答
0

由于“历史原因”。该方法是在 .NET 1(无泛型)中创建的,之后没有修复。与 ICloneable 等相同。

于 2013-01-28T11:51:32.177 回答