2016-03-31 9 views
0

Ich habe zwei Threads erreichen einen Punkt im Server-Programm zu etwas unterschiedlichen Zeiten, beide senden eine Zeichenfolge. Ich möchte, dass der Server an dieser Stelle anhält, bis beide Threads eine Zeichenfolge erhalten haben, und fahre dann fort. Zur Zeit verwende ich Console.ReadKey();, um den Thread "anzuhalten". Aber das ist keine Lösung, da ich zweimal eine Taste drücken muss (eine für jeden Thread), um fortzufahren.Mit einem Server zwei Threads zur gleichen Zeit Fortschritte

Gibt es eine Möglichkeit, einen globalen Zähler in der Programmklasse zu haben, auf den alle Threads jederzeit zugreifen und sie bearbeiten können? Ein ähnliches Konzept zu einem ConcurrentDictionary. Auf diese Weise kann ich zwischen Threads unterscheiden, basierend darauf, welcher Thread zuerst eine Zeichenfolge gesendet hat, und das Programm hängen lassen, bis der Zähler überzeugt ist, dass beide Clients "geantwortet" haben.

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

     } 
    } 
} 

Dies ist eine grobe Vorstellung davon, was mein Code tut, habe ich ziemlich viel gehackte Frage aufblasen zu vermeiden, so könnte es ein paar Dinge, die fehlerhaft sind, die ich verpasst habe.

Ich könnte theoretisch nur einen Timer setzen, wenn der Frage-String vom Server gesendet wird, aber ich würde lieber nicht in diesem Stadium.

Alle Gedanken oder Hinweise würden sehr geschätzt werden. Danke im Voraus.

+0

A while-Schleife mit einer Bedingung? Eine Variable kann normalerweise von mehreren Threads bearbeitet werden, außer wenn die Race-Bedingung ausgeführt wird. Wenn Sie jedoch warten möchten, verwenden Sie eine while-Schleife mit einer booleschen Bedingung. –

+0

Wo würde diese Variable deklariert? Ich habe experimentiert, um einen in die Programmklasse zu setzen, aber wenn ich es nicht übergebe, wenn der Thread erstellt wird, funktioniert das nicht. und zu dem Zeitpunkt, zu dem die Threads erstellt werden, ist die Bedingung der vorgeschlagenen While-Schleife nicht bekannt – James

+0

Möchten Sie, dass beide Threads zur gleichen Zeit oder nur eine? Sie könnten die Variable immer als Ref-Parameter übergeben ... –

Antwort

2

Verwenden Sie eine System.Threading.Barrier, die für diesen genauen Zweck entwickelt wurde: jeden Thread in einer Gruppe von Threads warten, bis alle von ihnen einen Punkt in ihrer Berechnung erreicht haben. Initialisieren in runServer() wie folgt aus:

Barrier barrier = new Barrier(2); 

und tun dies am Ende jedes Fadens:

barrier.SignalAndWait(); 
+1

Ich wusste nichts darüber. Nett! –

+1

absolut perfekt. Sehr geschätzt. – James

+0

:-) - es gibt eine Menge Extras in 'System.Threading' - ein weiterer persönlicher Favorit ist das' AutoResetEvent', um einen Thread warten zu lassen, bis ein anderer Thread ihm ein Signal sendet. –

Verwandte Themen