2016-07-11 11 views
0

Ich habe eine String-Liste List<string> mylist. Ich habe eine Hintergrundoperation, die Strings zu dieser Liste hinzufügt. i verwenden Sie einen anderen Hintergrund Betrieb die Saiten in dieser ListeOver-Collection wurde geändert; Enumerationsoperation kann nicht ausgeführt werden

foreach (string pfile in mylist) 
{ 
//dostuff 
} 

Dies führt zu dieser Ausnahme

Collection was modified; enumeration operation may not execute 

ich die vollständige Liste der Dateien, Dateien abrufen kann nicht verarbeitet werden, bevor man die Schleife als eine Timer-Betrieb fügt zu der Liste, während die Schleife läuft. Wie kann ich dieses Problem umgehen. Bitte um Rat.

+0

Möglicherweise möchten Sie verwenden [etwas anderes als 'Liste '] (https://msdn.microsoft.com/en-us/library/dd997305 (v = vs.110) .aspx) –

Antwort

0

Sie müssen eine Art Verriegelung einleiten.

private object _locker = new object(); // Class member object 

void ProcessList() // Or whatever it's called 
{ 
    lock (_locker) 
    { 
     foreach (string pfile in mylist) 
     { 
      //dostuff 
     } 
    } 
} 

Stellen Sie sicher, dass die anderen Threads Add-Aktivität in einer lock auch wickeln, das gleiche _locker Objekt.

Wenn der //dostuff Code eine lange Zeit in Anspruch nimmt, können Sie auf eine Kopie der Liste zu prüfen, den Betrieb der Höhe der Zeit zu minimieren, die Liste ist gesperrt,

string[] mylistCopy; 

    lock (_locker) 
    { 
     mylistCopy = mylist.ToArray(); 
    } 

    foreach (string pfile in mylistCopy) 
    { 
     //dostuff 
    }