2016-03-28 30 views
0

Her değişkendeki aynı mantığı aynı anda yapan bir döngü çalıştırmaya çalışıyorum. Bunu foreach döngüsüyle deniyorum ama aynı anda yapmak yerine, her seferinde bir değer alıyor ve bunun için mantığı yürütüyor ve ardından hepsi için aynı anda yapmak yerine bir sonrakine geçiyor. . ŞimdiAynı anda bir foreach çalıştırılamıyor

public static ArrayList MyFamily = new ArrayList() { "Me", "Mom", "Dad", "Brother" } 
public static bool SayPrayer = false; 
public static bool PickUpTheFork = false; 
public static bool StartEating = false; 

ı her biri aynı anda aynı şekilde yemekte bütün ailem davranacağınızı yapmak istiyorum diyelim:

public static void Dinner() 
{ 
    foreach (string Person in MyFamily) 
    { 
     SayPrayer = true; 
     Thread.Sleep(30000); 
     SayPrayer = false; 
     PickUpTheFork = true; 
     Thread.Sleep(3000) 
     PickUpTheFork = false; 
     StartEating = true; 
    } 
} 

bunu anladım Bir örnek olarak bu alalım Her eylem için ayrı foreach döngüler yapar ve bunlar arasında thread.sleep koymak (döngüleri dışında) bir şekilde çalışır. Ancak, bunu yapmak için daha kolay bir yolu var mı?

+0

Neden her kişinin aynı anda güncellenmediğini düşündüğünüzden emin değilim (değişkenler statik olduğundan ve tek bir kişiye ait olmadığından: "SayPrayer" ayarlandığında, herkes bir dua söyleyecektir) . Hata ayıklama şeklinizi detaylandırır mısınız? – Rob

cevap

2

task parallel library erişiminiz varsa, Parallel.ForEach yöntemi tam olarak istediğiniz şeyi yapar.

Parallel.ForEach(MyFamily, (person) => { 
    // perform operations 
}); 

Düzenleme: işlemleri aynı andaçalışacaktır ancak kendi iplik her görevi gerekmeyebilir: o yorumlarınızda geldiğinden beri, burada o kadar söz edeceğiz. TPL , MyFamily koleksiyonunun her üyesinde bu işlemleri mümkün olduğunca eşzamanlı olarak çalıştırmayı deneyecektir.

+0

Not: Bu, kişi başına bir iş parçacığı üretme garantisi değildir. Çalışacak, ama sadece bazen. Her eylem için bir döngü gerçekten bunu yapmak için tek mantıklı yoldur. – Rob

0

Bu durumda, bu sınıftaki her bir boole için bir Statik değişken tanımlayacağım. Bu gerçekleştirmek için temiz bir (ve bellek verimli) yoludur

Person.SayPrayer = true; 
    Thread.Sleep(30000); 
    Person.SayPrayer = false; 
    Person.PickUpTheFork = true; 
    Thread.Sleep(3000) 
    Person.PickUpTheFork = false; 
    Person.StartEating = true; 

public class Person{ 
    public static bool SayPrayer = false; 
    public static bool PickUpFork = false; 
    public static bool StartEating = false; 
    //... 
} 

ve o zaman sadece duyabileceği koleksiyonu her üyesi için de geçerli olacak bu statik değişkenler, ayarlayabilirsiniz ... iterasyon veya 3. parti kütüphaneleri olmadan tanımladığınız işlem.