我想知道为什么 .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 的人不愿意写这样的东西的几个原因:
- 如果您担心性能,那么与实际创建线程相比,转换(即使是拆箱)的影响要小得多。
- 如果您担心类型安全,可以轻松使用 lambda:
new Thread(() => SayHello("Hello"))
. -
Thread<T>
将是一个令人困惑的类型,因为不清楚它是什么T
代表。特别是因为它的含义与T
完全不同。在Task<T>
. - 如果需要,您可以创建自己的
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/