2010-04-14 4 views
10

Apropos System.Collections.Generic.List<T> hier.Können zwei oder mehr Threads ohne Probleme über dieselbe Liste <t> iterieren?

Mit Beispiel unten können Methode1 und Methode2 gleichzeitig und auf verschiedenen Threads ohne Probleme ausgeführt werden?

Dank

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

Antwort

22

Ja, List<T> ist sicher von mehreren Threads gelesen, solange kein Thema Modifizieren der Liste enthalten sind.

Von the docs:

A List<T> gleichzeitig mehrere Leser unterstützen kann, solange die Sammlung nicht geändert wird. Aufzählung durch eine Sammlung ist intrinsisch kein Thread-sicheres Verfahren. In dem seltenen Fall, in dem eine Enumeration mit einem oder mehreren Schreibzugriffen konkurriert, ist die einzige Möglichkeit, Thread-Sicherheit sicherzustellen, die Sammlung während der gesamten Enumeration zu sperren. Damit die Sammlung auf mehrere Threads für Lesen und Schreiben zugreifen kann, müssen Sie Ihre eigene Synchronisierung implementieren.

(Der Punkt, um das Iterieren zu sein, ist in Bezug auf etwas anderes die Liste mutiert. „Intrinsisch keinen Thread-sichere Verfahren“ hergestellt)

0

Sie verwenden, um die Iteratoren von der foreach bekommen() ganz gut auf mehreren Threads. Solange Sie nicht Elemente aus der Liste hinzufügen oder entfernen, sollten Sie in Ordnung sein. Ich glaube, dass du sogar die Mitglieder von allem verändern kannst, was du auch bist, aber das führt dich in nicht-Thread-sicheres Territorium.

Verwandte Themen