Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Я делаю лабу сервер распределенных вычислений в сети. В одном потоке ожидаю клиентов и на каждого клиента создаю поток.
while (true)
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();//ждем очередного клиента
                Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");//подключился новый клиент
                handleClinet client = new handleClinet();
                Program.clients.Add(counter,false);//добавили в список клиента
                client.startClient(clientSocket, counter);//вызываем функцию обработки клиента. counter нигде не уменьшается, просто всегда растет. Клиенты не только добавляются, но и могут удаляться.
            }
В другом потоке жду пока введут задание на клавиатуре, после чего нужно пробегаться по списку клиентов, ища не занятого клиента и давая ему задания, пока эти задания не кончатся.
temp_c = n_com;
while (temp_c == n_com)//ждем, пока команда не сработает
                    {
                        foreach (KeyValuePair<int, bool> i in clients)//проходим по клиентам
                        {
                            if (i.Value)//отправить работу, если готов клиент
                            {
                                in_con = "decode " + i.Key.ToString();//меняем команду для клиента
                                n_com++;//сработала команда.
                                while (i.Value) { }//ожидаем, пока клиент не заработал
                                break;
                            }
                        }
Как клиент начинает работу:
if ((Program.in_con == "decode " + clNo.ToString()) && (n_com_cur == Program.n_com))//clNo-номер клиента в списке, n_com_cur-номер последней выполненной команды. если команда для него и команда новая, то клиент начинает работу
{  
            Program.clients[clNo] = false;//не готов к работе клиент
//...отправка сообщений клиенту, прием сообщений
            n_com_cur++;
            Program.clients[clNo] = true;//готов к работе клиент
}
Проблема в том, что если оставить код таким, то i.Value никогда не измениться и программа уйдет в бесконечный цикл. Если сделать ожидания простоять 1000 шагов, то это бред и появляется ошибка: нельзя бегать по foreach, т.к. Dictionary изменился в другом потоке(Когда клиент начинает работу, он меняет свое значения занятости на false, когда заканчивает - true). Вопрос: есть ли более оптимальный способ хранить список клиентов и их занятость? сейчас они хранятся в виде Dictionary<int, bool>. Если нет, то есть ли какой-либо другой способ пробегать список, чтобы была устойчивость к изменению Dictionary из другого потока, и не возникало гонок, т.е. основной процесс дожидался момента, когда выбранный им клиент заработает? Заранее, спасибо!

Решение задачи: «Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке»

textual
Листинг программы
Lock(Dictionary)
{
///
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5
Похожие ответы