2010-04-14 2 views
10

System.Collections.Generic.List<T> hakkında konuşun.İki veya daha fazla iş parçacığı, herhangi bir sorun olmadan aynı Liste <t> üzerinden yineleyebilir mi?

Aşağıdaki örnekte, herhangi bir sorun olmadan farklı iş parçacığı üzerinde Method1 ve Yöntem2 aynı anda ve aynı zamanda yürütülebilirler mi? kadar uzun konu listesini değiştirerek gibi birden çok iş parçacığı okumak için

Teşekkür

class Test 
{ 
    private readonly List<MyData> _data; 

    public Test() 
    { 
     _data = LoadData(); 
    } 

    private List<MyData> LoadData() 
    { 
     //Get data from dv. 
    } 

    public void Method1() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 

    public void Method2() 
    { 
     foreach (var list in _data) 
     { 
      //do something 
     } 
    } 
} 

cevap

22

Evet, List<T> güvenlidir. the docs itibaren

: A List<T> sürece toplama değiştirilmediği şekilde, aynı anda birden fazla okuyucuları destekleyebilir

. Bir koleksiyonda numaralandırma özünde bir iş parçacığı güvenli yordamı değil. Bir numaralandırma bir veya daha fazla yazma erişir ile iddia nadir durumlarda, tek yol parçacığı güvenliği tüm numaralandırma sırasında koleksiyonunu kilitlemek olduğundan emin olmak için. koleksiyonunun okuma ve yazma için birden fazla iş parçacığı tarafından erişilmesine izin vermek için, kendi eşitlemenizi uygulamanız gerekir.

(yineleme "özünde bir iş parçacığı güvenli işlem değildir" başka bir şey listeyi mutasyona bakımından yapılır olma konusunda noktası.)

0
sadece ince foreach tarafından kazanılmış yineleyiciler() kullanabilir

Birden fazla iş parçacığı üzerinde. Listeden elemenler eklemediğiniz veya kaldırdığınız sürece, iyi olmalısınız. Senin, ne olursa olsun, üyelerini bile değiştirebileceğine inanıyorum, ama bu seni iş parçacığı olmayan bölgeye götürür.