Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке - C#
Формулировка задачи:
Здравствуйте!
Я делаю лабу сервер распределенных вычислений в сети.
В одном потоке ожидаю клиентов и на каждого клиента создаю поток.
В другом потоке жду пока введут задание на клавиатуре, после чего нужно пробегаться по списку клиентов, ища не занятого клиента и давая ему задания, пока эти задания не кончатся.
Как клиент начинает работу:
Проблема в том, что если оставить код таким, то i.Value никогда не измениться и программа уйдет в бесконечный цикл. Если сделать ожидания простоять 1000 шагов, то это бред и появляется ошибка: нельзя бегать по foreach, т.к. Dictionary изменился в другом потоке(Когда клиент начинает работу, он меняет свое значения занятости на false, когда заканчивает - true).
Вопрос: есть ли более оптимальный способ хранить список клиентов и их занятость? сейчас они хранятся в виде Dictionary<int, bool>. Если нет, то есть ли какой-либо другой способ пробегать список, чтобы была устойчивость к изменению Dictionary из другого потока, и не возникало гонок, т.е. основной процесс дожидался момента, когда выбранный им клиент заработает?
Заранее, спасибо!
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;//готов к работе клиент }
Решение задачи: «Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке»
textual
Листинг программы
Lock(Dictionary) { /// }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д