2012-08-13 35 views
2

我見過創建多個線程,看起來如下一些示例代碼:在C#基本線程

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

我把秒錶上的代碼兩件,他們大概花的時間是相同的,所以很奇怪,爲什麼第一個代碼塊被寫成這樣,除非它是保存一行代碼。

+2

他們將有同樣的效果;他們*語義*等價。它有助於代表是不可改變的。 – 2012-08-13 09:21:00

回答

0

我真的不能採取信貸這個答案,但是,引用馬克Gravell,

他們將有同樣的效果;它們的語義上是等價。 它有助於代表是不可改變的。

要在我自己的浮躁方式展開。

這是不是一個真正的關於線程的問題。 Thread構造函數將等效地工作,如果等於ThreadStart代表通過。

委託類型的關鍵「屬性」是其不變性。一旦不可變類型被實例化,它就不能被改變。這是相關的,因爲兩個代碼示例中的所有ThreadStart代表均使用ThreadSimple方法組構造。因此,無論代表生存期如何,所有Thread實例化都將傳遞一個等效委託。

0

我認爲第二個是更好,因爲你只能創建一個的ThreadStart,而不是3,但我不知道這是否會放棄的,因爲在多個線程共享這個對象的問題。

+1

代表是不可變的;共享是沒有問題的 – 2012-08-13 09:21:14

0

兩個片段是不是邏輯上等同
首先,您有三個不同類型的ThreadStart對象,而第二個中只有一個。

+3

委託是不可改變的,沒有屬性改變。 – 2012-08-13 09:18:40

+0

你說得對,我使用的例子不正確。但是你不能忽視你創建三個不同的對象的事實。 – Neowizard 2012-08-13 09:21:08

+0

是的,我誤讀了,並相應地編輯了我的評論;然而,事實是,你的第二個段落是一種誤導:*這是不可改變*:沒有什麼改變 – 2012-08-13 09:21:45

0
var simpleThreads = new[] 
{ new Thread(new ThreadStart(ThreadSimple)), 
new Thread(new ThreadStart(ThreadSimple)), 
new Thread(new ThreadStart(ThreadSimple)) }; 

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

在第一個代碼塊你已經產生了三個新的ThreadStart對象,雖然它交給單一的委託,但在第二個這是一個更好的實現,你沒有創建不必要的對象和保存LOC的形式完成。