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