2016-03-31 32 views
0

Sunucu programında bir noktaya iki farklı iş parçacığım var. Her iki iş parçacığı bir dize alıp devam edene kadar sunucunun bu noktada duraklamasını istiyorum. Şu anda iş parçacığı "duraklatmak" için Console.ReadKey(); kullanıyorum. Ama bu bir çözüm değil, ilerlemek için iki kere bir tuşa basmalıyım (her iş parçacığı için bir tane).Bir Sunucuya sahip olmak aynı anda iki iş parçacığına sahip oluyor

Tüm sınıflar tarafından her zaman erişilebilen ve düzenlenebilir program sınıfında global bir sayaç sahibi olma olasılığı var mı? ConcurrentDictionary'a benzer bir kavram. Bu şekilde, hangi iş parçacığının önce bir dize gönderdiğine ve her iki istemcinin de yanıt verdiğinden emin oluncaya kadar programın askıda kalmasını sağlayarak iş parçacığı arasında ayrım yapabiliyorum.

class Program 
{ 
    public static bool isFirstThread = false; 

    static void Main(string[] args) 
    { 
     runServer(); 
    } 

    static void runServer() 
    { 
     //server setup 
     Thread[] threadsArray = new Thread[2]; 
     int i = 0; 
     try 
     { 
      while(true) //game loop 
      { 
       Socket connection; 
       connection = listener.AcceptSocket(); 
       threadRequest = new Handler(); 

       if(i==0) //first thread 
       { 
        threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, true); 
       } 
       else //not first thread 
       { 
        threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, false); 
       } 

       threadsArray[i].Start(); 
       i++; 
      } 
     } 

     catch(Exception e) 
     { 
      Console.WriteLine("Exception: " + e.ToString()); 
     } 
    } 
} 


class Handler 
{ 
    public void clientInteraction(Socket connection, bool isFirstThread) 

    { 
     string pAnswer = string.Empty; 
     //setup streamReaders and streamWriters 

     while(true) //infinite game loop 
     { 
      //read in a question and send to both threads. 
      pAnswer = sr.ReadLine(); 
      Console.WriteLine(pAnswer); 

      Console.ReadKey(); //This is where I need the program to hang 

      awardPoints(); 

     } 
    } 
} 

Bu ben kaçırmıştım sapıklık içindedirler birkaç şey olabilir bu yüzden soru kabartmak önlemek için biraz doğranmış ettik benim kod ne yaptığını kaba bir fikirdir.

Teoride, soru dizisinin sunucudan gönderildiği zamandan bir zamanlayıcı ayarlayabilirdim, ancak bu aşamada olmamayı tercih ederim.

Herhangi bir düşünce veya işaretçi çok takdir edilecektir. Şimdiden teşekkürler.

+0

A koşulu ile döngü sırasında? Bir değişken, genellikle, yarış durumunun gerçekleştirilmesi dışında, birden fazla iplik tarafından düzenlenebilir. Ancak, beklemek isterseniz, boolean koşuluyla bir while döngüsü kullanın. –

+0

Bu değişken nerede bildirilir? Ben program sınıfına bir tane koyarak deneylerim ama iş parçacığı oluşturulduğunda ben geçmezse, bu işe yaramaz. ve iş parçacığı oluşturulduğunda, önerilen süre döngüsünün durumu bilinmiyor – James

+0

Her iki iş parçacığının aynı anda mı, yoksa yalnızca bir tane mi devam etmesini istiyorsunuz? Değişkeni her zaman bir "ref" parametresi olarak geçirebilirsiniz ... –

cevap

2

Bu tam amaç için tasarlanmış bir System.Threading.Barrier kullanın: bir iş parçacığı içinde her iş parçacığının tümü, hesaplamalarında bir noktaya ulaşana kadar bekleyin.

Barrier barrier = new Barrier(2); 

Ve her bir iş parçacığı sonunda bunu: Böyle runServer() bunu başlat

barrier.SignalAndWait(); 
+1

Bundan haberiniz yoktu. Güzel! –

+1

kesinlikle mükemmel. Çok takdir edildi. – James

+0

:-) - System.Threading'de çok fazla güzellik var - başka bir kişisel favori ise, başka bir iş parçacığı bir sinyal gönderene kadar bir iş parçacığının beklemesini sağlayan 'AutoResetEvent'. –

İlgili konular