c# - 为什么 .Net 没有 Thread.Start() 的通用版本?

标签 c# multithreading

我想知道为什么 .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);

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

最佳答案

我可以看出实现 BCL 的人不愿意写这样的东西的几个原因:

  1. 如果您担心性能,那么与实际创建线程相比,转换(即使是拆箱)的影响要小得多。
  2. 如果您担心类型安全,可以轻松使用 lambda:new Thread(() => SayHello("Hello")) .
  3. Thread<T>将是一个令人困惑的类型,因为不清楚它是什么 T代表。特别是因为它的含义与 T 完全不同。在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);
    }
}

关于c# - 为什么 .Net 没有 Thread.Start() 的通用版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14561382/

相关文章:

c# - 使用 .NET 图像转换是否足够?

c# - 深度优先搜索图无法正常工作

c++ - 在 main 内部创建的线程和在函数内部创建的线程的行为是否应该不同?

c# - .NET 4.0 System.Collections.Concurrent 集合在 .NET 3.0 SynchronizedCollection 的功能中添加了什么?

c++ - 如何在 C++ 中使用 boost 获取定时器功能?

c# - 如何在 Windows 窗体应用程序中关闭多个窗体

c# - 计算 MD5 和 SHA1 校验和时出现 IOException

c# - 如何使用 SendKeys 发送 NumPad 键?

c# - Xamarin.iOS 主线程和后台线程运行不正常

java - 为什么有人需要线程安全的 SimpleDateFormat 对象?