Рассмотрим этот код:
class program
{
public static ConcurrentDictionary<string, int> dictionary = new ConcurrentDictionary<string,int>();
static void Main(string[] args)
{
runServer();
}
static void runServer()
{
//Server setup
Handler threadRequest;
Thread[] threadsArray = new Thread[2];
int i = 0;
while(true)
{
Socket connection;
connection = listener.AcceptSocket();
threadRequest = new Hander();
threadsArray[i] = new Thread(() => threadRequest.clientInteraction(connection, dictionary));
threadsArray[i].Start();
i++;
}
}
}
class Handler
{
public void clientInteraction(Socket connection, ConcurrentDictionary<string, int> dictionary)
{
NetworkStream socketStream;
socketStream = new NetworkStream(connection);
StreamWriter sw = new StreamWriter(socketStream);
StreamReader sr = new StreamReader(socketStream);
parseStrings(out pTeamName); //checks to see if its a valid "add team" request
dictionary.tryAdd(pTeamName, 0);
while(dictionary.Count < 2)
{
//hang until two teams
}
sw.WriteLine("Welcome To The Game.");
sw.Flush();
foreach(KeyValuePair<string, int> kvp in dictionary)
{
Console.WriteLine("Team: {0}", kvp.Key);
}
foreach(KeyValuePair<string, int> kvp in dictionary)
{
sw.WriteLine("Team: {0}", kvp.Key);
sw.Flush();
}
}
}
Эта программа принимает два клиентских соединения как разные потоки и запускает метод clientInteraction
в классе обработчика для каждого потока. Меня беспокоит то, что если два потока одновременно попадут в sw.Flush()
, сервер не сможет его выполнить.
Я полагаю, что это так, поскольку сервер не печатает «Добро пожаловать в игру» ни одному из клиентов, а печатает только одну запись dictionary
(одна и та же запись) для обоих клиентов и пропускает одну.
От отладки и Console.WriteLine
до просто консоли сервера я знаю, что словарь заполнен правильно. Я просто не понимаю, почему письмо клиентам не работает.
Любая помощь приветствуется, и если я пропустил что-то важное, дайте мне знать. Заранее спасибо.
РЕДАКТИРОВАТЬ: Кажется, что по какой-то причине любой «другой» набор флешей работает. Я например поставил:
while(true)
{
sw.WriteLine("BOO");
sw.Flush();
Console.ReadKey();
}
Прямо под циклом foreach для печати словаря клиентам. Первые два ReadKeys
выводят "BOO" одному из клиентов (в зависимости от того, какой поток первый), затем два следующих ничего не делают. Следующие два, однако, снова печатают «BOO». Я не особенно хочу обрамлять каждый sw.Flush()
циклом i=2 for
только для того, чтобы заставить его работать.
while(true)
, потому что я не вижуbreak
илиreturn
. - person Quantic   schedule 28.03.2016threads[2]
не существует, поэтому он просто рухнет после того, какi++
запустится во второй раз. Я дойду до двери, иначе у меня не будет много полезного. - person Quantic   schedule 28.03.2016