2013-01-17 23 views
5

Sadece bazı öneriler Başka bir sisteme işlem yapmak ve işlem yapmak için 100.000 + xml dosyam var.ParallelForeach kullanarak Dosya İşleme. Bu en iyi yaklaşım

public void ProcessFiles() 
    { 
     IEnumerable<FileInfo> orderedFiles = GetFilesOrdered(); 

     foreach (FileInfo file in orderedFiles) 
     { 
      ProcessFile(file); 
     } 
    } 

Ben Görev Paralel kütüphaneye hakkında okuma ama emin değil edilmiştir:

kavram

Ben böyle bir döngü var oldukça basittir. Diş çekme işlemine çok fazla yapışmış değil. TPL benim için çok şey sarıyor gibi görünüyor.

Basitçe söylemek gerekirse sadece paralel bir durum mu kullanıyorsunuz?

herhangi bir örnek veya öneriler

+0

Merhaba, İş parçacığı güvenliği için, Bu dosyalardan herhangi birinin eşzamanlı olarak erişilemediğinden emin olun. –

+0

@ Joe.wang Bir kilit ekleme anlamına mı geliyor? eğer bana bir snippet sağlayabilir misiniz? Zamanınız için teşekkürler – user9969

+0

'index' değişkeni nedir? Kullanmıyor gibisin. – Bridge

cevap

0

Evet, Parallel.ForEach ile foreach değiştirme gibi basit olabilir.

Birden çok iş parçacığının aynı anda ProcessFile'u çalıştırdığını hatırlamak zorundasınız.

Yani, bu yöntemde herhangi bir paylaşılan duruma yazıyorsanız, onu korumak için senkronizasyon yapılarını kullanmanız gerekecektir.

+4

Bir düşünce daha: Buradaki paralellik eklemek, şu anda sadece IO'nun şişe boynu –

+0

@NicholasButler değilse, mantık koşullarını paralel kütüphaneyle nasıl önlerseniz anlamlıdır. – user9969

+0

@ user231465 bir kilit kullanıyor musunuz? Bu büyük bir konu. Joe Albahari'nin e-kitabını okumanı tavsiye ederim. Eşzamanlı kodu doğru bir şekilde yazacaksanız, içindeki her şeyi anlamanız gerekecektir. –

0

Albahari size yardımcı Umut: Eğer çoklu iş parçacığı yeniyseniz

, buradan okumalısınız büyük tanıtım e-kitap var. Dosyayı paralel olarak nasıl taşıyacağınızı gösteren basit bir snippet.

 List<FileInfo> files = new List<FileInfo>(); 
     files.Add(new FileInfo("F:\\1.xml")); 
     files.Add(new FileInfo("F:\\2.xml")); 
     files.Add(new FileInfo("F:\\3.xml")); 



     Parallel.ForEach(files, f => 
     { 
      f.MoveTo("d:\\test\\" + f.Name); 
     }); 
İlgili konular