2010-04-23 73 views
4

在擴展方法中使用yield運算符會是線程安全的嗎?在擴展方法中使用'yield'運算符是線程安全的嗎?

例如:

public static IEnumerable<CartItem> GetItems(this Cart cart) 
{ 
     { 
      while(cart.hasNext()) 
       yield return cart.GetNextItem(); 
     } 
} 
+2

FYI,返回值必須是一個IEnumerable,否則yield return語法不會生成。 – 2010-04-23 23:39:20

+0

我以前感謝過你嗎? hehehe:P +1 – SDReyes 2010-04-23 23:47:07

回答

3

我不太明白你的意思,但收益率迴歸本質導致函數產生一個狀態機的包裝類,並返回類的一個實例。每個收益回報是來自狀態機的回報。通過調用您的方法返回的單個實例不會是線程安全的(您不能同時從多個線程迭代它),但多個調用會生成單獨的實例。那些單獨的實例可以被多個線程使用,並且在這種情況下線程安全性由枚舉器使用的類的線程安全性確定(在您的情況下爲cart的方法)。

+0

謝謝你丹。你已經回答了我的問題+1 無論如何,讓我用一個更簡單的例子來澄清我的觀點,爲更多的讀者; ) – SDReyes 2010-04-23 23:33:11

+0

謝謝你根據新的例子更新你的答案,Dan。 – SDReyes 2010-04-23 23:50:28