2009-10-18 48 views
0

只是爲了確保,說,我有這樣的代碼:普查員和線程安全

this.allObjects = [some linq query]; 

,有兩個方法,這兩個讀(不能修改)這個IEnumerable的,他們是安全的並行打電話?通過一個IEnumerable循環應該是安全的嗎?

回答

1

它取決於枚舉器的實現,但在大多數情況下,它是安全的。

但有一點需要注意:僞代碼,因爲您擁有它,實際上並沒有做任何事情(由於延遲執行)。 LINQ查詢只會在您訪問allObjects時執行(或者您在LINQ查詢中調用類似ToList()的東西)。

+0

是的,但那很好?當我通過for-eaching訪問linq查詢時,它會運行GetEnumerator並生成一個新的IEnumerable ...在相同的IEunumerable上循環可能會更糟。 – Homde 2009-10-18 07:40:56

+0

正確。唯一一次併發是一個問題,如果通過迭代進行修改(這不是任何人所期望的,但是可能的) - 然而,這從來沒有發生在標準集合上。 – 2009-10-18 17:47:09

0

IEnumerable<T>實例可能很好(雖然它取決於實現)。

IEnumerator<T>實例可能是不是罰款(雖然再次:實施細節)。