0

Ich benutze viele parallel foreach Schleifen. Sie werden hauptsächlich zum Ausarbeiten von Daten und nach dem Hinzufügen zu einer Liste verwendet.C# Parallel.ForEach werfen indexOutOfBoundException

dies ist ein Beispiel für meine Methoden:

System.Threading.Tasks.Parallel.ForEach(magazzini, m => 
{ 
    try 
    { 
     warehouse.Add(new WAREHOUSE() 
     { 
      ID = m.Id, 
      NAME = m.new_name, 
      CODE = m.new_codice, 
      INTEGRATION_KEY = m.dynamics_integrationkey, 
      RESOURCE_ID = m.new_mobileuser == null ? Guid.Empty : m.new_mobileuser.Id 
     }); 
    } 
    catch (Exception ex) 
    { 
     Logging.Error(authToken, string.Format("GetAllMagazzini|Magazzini|{0}", ex.InnerException)); 
    } 
}); 

Ich las in this old post, dass es durch die nicht verursacht werden könnte, Thread-sicher-Eigenschaft der List<T>. Mein Problem ist folgendes:

Ich habe diese nicht nur für solche Schleifen, sondern auch für lange Schleifen mit vielen Operationen. Ich musste die parallel.foreach verwenden, weil die Verwendung der klassischen foreach die Abfrage zu Timeout macht, da es auf einem WebService ist.

Wie kann ich die parallel.foreach vermeiden die indexOutOfBoundException? Ich muss die List<T> in etwas anderem ändern?

Antwort

1

Ja, ändern Sie List<T> in ConcurrentBag<T>, da die Größenanpassung des Hintergrundarrays in List<T> Probleme mit gleichzeitigem Schreiben verursacht. Eine andere Option ist das Erstellen einer lock um die Add-Operation.

Wenn keine anderen Vorgänge vorhanden sind, ist das Hinzufügen von Parallel.ForEach Nebenläufigkeit nicht erforderlich und wirkt sich sogar negativ auf die Leistung aus. Wenn dies der Fall ist, erstellen Sie eine reguläre foreach oder verwenden Sie AddRange.

+0

Vielen Dank! nur eine kleine Frage: Warum, wenn es nur die Add-Operation gibt, wird es sich negativ auf die Performance auswirken? Wie kann man wissen, ob parallel oder nicht parallel foreach? –

+1

Sie können die Größe eines Arrays nicht parallel ändern, Sie können keine Speicheradresse parallel einstellen. Das wäre also ein Nein für Nebenläufigkeit. Wenn Sie den Inhalt einer Datei, einer Webseite, erhalten, können mehrere Aktionen nebeneinander ausgeführt werden, sodass die gleichzeitige Ausführung möglich ist. –