c#中的基本线程

时间:2012-08-13 09:13:30

标签: c# multithreading

我见过一些示例代码,它们创建了许多线程,如下所示:

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 个答案:

答案 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实例都会传递一个等效的委托。