我见过一些示例代码,它们创建了许多线程,如下所示:
var simpleThreads = new[] {
new Thread(new ThreadStart(ThreadSimple)),
new Thread(new ThreadStart(ThreadSimple)),
new Thread(new ThreadStart(ThreadSimple))
};
逻辑上,这与以下相同吗?
var ts = new ThreadStart(ThreadSimple);
var simpleThreads = new[] {
new Thread(ts),
new Thread(ts),
new Thread(ts)
};
我在两段代码上放了一个秒表,它们花了大约相同的时间,所以我想知道为什么第一块代码是这样编写的,除非是为了保存一行代码。
答案 0 :(得分:0)
我认为第二个更好是因为你只创建一个ThreadStart而不是3但我不知道这是否会因为在多个线程上共享这个对象而产生问题。
答案 1 :(得分:0)
两个片段在逻辑上不等同 在第一个中,你有三个不同类型的ThreadStart对象,而在第二个你只有一个。
答案 2 :(得分:0)
var simpleThreads = new[]
{ new Thread(new ThreadStart(ThreadSimple)),
new Thread(new ThreadStart(ThreadSimple)),
new Thread(new ThreadStart(ThreadSimple)) };
和新线程(ts)不是一回事。
在第一个代码块中,您已经生成了三个新的threadstart对象,尽管引用了单个委托,但在第二个代码块中,这是一个更好的实现,您已经完成了,但没有创建不必要的对象并保存了LOC。
答案 3 :(得分:0)
我不能真正赞同这个答案,但引用Marc Gravell的话,
它们会产生同样的效果;它们语义等价。 它有助于代表不可变。
以我自己的浮躁方式扩展。
这不是关于线程的问题。如果传递相等的Thread
个委托,ThreadStart
构造函数将等效地工作。
委托类型的关键“属性”是它的不变性。一旦实例化了不可变类型,就不能改变它。这是相关的,因为两个代码示例中的所有ThreadStart
委托都是使用ThreadSimple
方法组构造的。因此,无论委托的生命周期如何,所有Thread
实例都会传递一个等效的委托。