2011-11-21 19 views
7

Tamam, işte burada temel arka plan. Bu program, görünümüne/değiş tokuşuna bağlanır ve hangi şifrelenmiş olduğunu görmek için tüm posta iletilerinden ayrılır. Yapmak istediğim şeylerden biri, mesajları taramak için gereken süreyi azaltmak için çok iş parçacığı kullanmaktır.Parallel.ForEach döngüsüne bir foreach döngüsünü değiştirme

foreach (Object item in folder.Items) { 
//Checks for encryption and gets needed info and updates count 
} 

Ve yerine Parallel.ForEach fonksiyonunu kullanmak istiyorum:

Şu kod şöyle görünür. Nasıl kurabileceğimi merak ediyordum. İfadeyi şimdi nasıl oluşturduğunu ayarlamayı denedim, ancak Nesne türünün bir değişken olarak kullanıldığını belirten bir hata alıyorum. Bununla ilgili herhangi bir yardım çok takdir edilecektir.

Tamam, verdiğim düzen doğru görünüyor. Kod şu anda şöyle görünür:

Error 15 The type arguments for method System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Herhangi fikirleri:

Parallel.ForEach(folder.Items, item => 
{ 
//does stuff 
}); 

Şimdi aşağıdaki hatayı alıyorum? Yardımınız için teşekkürler, takdir edilmektedir.

Tamam, bu siteyi buldum: http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx ve bana bu hataya gereken cevabı verdi. Bir koleksiyon işlevi oluşturarak koleksiyonunu genel bir değere dönüştürmem gerekiyordu.

static IEnumerable<object> Cast(IEnumerable source) 
{ 
    foreach (object o in source) 
     yield return o; 
} 

Ve sonra hatasız çalıştığını Şimdi

Parallel.ForEach(Cast(folder.Items), item => 
{ 
//does stuff 
}); 

orijinal çimdik. Yaşasın. Böyle

+2

Lütfen değiştirilen kodu (hata mesajını veren kod) gönderin. –

+0

Düzenlemeden Sonra: Artık, klasörün IEnumerable'ın uygulanması gerekliliğinden söz etmek için 'folder.Items 've/veya' // stuff' –

cevap

7

şey:

Parallel.For(0, folder.Items.Count - 1, delegate(int i) { 
    object item = folder.Items[i]; 
}); 

Veya ForEach ile:

Parallel.ForEach(folder.Items, item => {whatever you want to do with item}) 

Not: folder.Items bu doğru olduğunu varsayarsak IEnumerable

+1

+1 'e bağlıdır. –

+1

@ericj: "için (Öğelerdeki öğeler) ..." –

4

uygulayan zorundadır

foreach (Object item in folder.Items) 
    Process(item); 

th tr

Parallel.ForEach (folder.Items, item => Process(item));