2

我看过一些示例代码,它创建了一些如下所示的线程:

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)
            };

我在两段代码上都放了秒表,它们花费的时间大致相同,所以我想知道为什么第一段代码是这样写的,除非是为了节省一行代码。

4

4 回答 4

0

我不能真正相信这个答案,但是,引用 Marc Gravell 的话,

它们将具有相同的效果;它们在语义上是等价的。委托是不可变的,这很有帮助。

以我自己的笨拙方式扩展。

这实际上不是关于线程的问题。如果传递了Thread相等的委托,则构造函数将等效地工作。ThreadStart

委托类型的关键“属性”是它的不变性。一旦实例化了不可变类型,就无法更改它。这是相关的,因为ThreadStart两个代码示例中的所有委托都是使用ThreadSimple方法组构造的。因此,Thread无论委托的生命周期如何,所有实例都会传递一个等效的委托。

于 2012-08-13T09:55:12.227 回答
0

我认为第二个更好,因为您只创建一个 ThreadStart 而不是 3,但我不知道这是否会因为在多个线程上共享此对象而产生问题。

于 2012-08-13T09:17:11.553 回答
0

这两个片段在逻辑上并不等价
在第一个中,您有三个不同的 ThreadStart 类型的对象,而在第二个中,您只有一个。

于 2012-08-13T09:17:43.300 回答
0
var simpleThreads = new[] 
{  new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple))  }; 

和 new Thread(ts) 不是一回事。

在第一个代码块中,您生成了三个新的 threadstart 对象,虽然引用了单个委托,但在第二个代码块中,这是一个更好的实现,您无需创建不必要的对象并保存 LOC。

于 2012-08-13T09:23:09.897 回答