0

Çok fazla parallel foreach döngüsünü kullanıyorum. çoğunlukla verileri detaylandırmak için kullanılırlar ve bir listeye ekledikten sonra.C# Paralel.ForEach atma indexOutOfBoundException

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

Ben List<T> arasında parçacığı için güvenli değil mal nedeniyle olabileceğini this old post okumak:

bu benim yöntemlerden bir örnektir. Benim sorun şu:

Sadece bu gibi döngüler için değil, aynı zamanda çok sayıda işlem ile uzun döngüler için de var. foreach, WebService üzerinde olduğundan, zaman aşımı sorgusu kullanarak parallel.foreach kullanmak zorunda kaldım.

indexOutOfBoundException'dan kaçınarak parallel.foreach'u nasıl kullanabilirim? List<T>'u başka bir şeyde mi değiştirmeliyim?

cevap

1

Evet, List<T> içinde destek dizinin yeniden boyutlandırma beri ConcurrentBag<T> değişiklik List<T> eşzamanlı yazma operasyonları ile sorunlara neden olur. Başka bir seçenek, ekleme işlemi etrafında bir lock oluşturmaktır.

Parallel.ForEach eşzamanlılığınıza ekleyen başka bir işlem yoksa, performansınızı olumsuz yönde etkileyecektir. Durum buysa, düzenli bir foreach oluşturun veya AddRange'u kullanın.

+0

Çok teşekkürler! sadece küçük bir soru: neden sadece ekleme işlemi varsa, performansı olumsuz etkileyecektir? Paralel olmayan veya paralel olmayan foreach kullanarak nasıl bililir? –

+1

Bir diziyi paralel olarak yeniden boyutlandıramazsınız, paralel olarak bir bellek adresi ayarlayamazsınız. Yani bu eşzamanlılık için hayır olur. Bir dosyanın içeriğini, bir web sayfasını alırsanız, yan yana birden çok eylem gerçekleştirebilirsiniz, böylece eşzamanlılık sağlar. –

İlgili konular