Вы просто не можете изменить Hashtable
, Dictionary
, List
или что-то подобное, пока вы итерируете по нему - в том же потоке или в другом.В .NET 4 есть параллельные коллекции, которые позволяют это, но я предполагаю, что вы не используете .NET 4. (Из интереса, почему вы все еще используете Hashtable
, а не универсальный Dictionary
?)
Вы также не должны изменять Hashtable
из одного потока при чтении из него в другом потоке без какой-либо синхронизации.
Самый простой способ исправить это:
- Создать новую переменную только для чтения, используемую для блокировки
Получить блокировку перед добавлением в Hashtable:
lock (tableLock)
{
ClientTable.Add(ReceiveSock.RemoteEndPoint.ToString(), ReceiveSock);
}
Если вы хотите выполнить итерацию, создайте новую копию данных в Hashtable
в пределах блокировки
- Выполните итерацию по копии вместо исходной таблицы
Вам определенно даже нужно a Hashtable
здесь?Мне кажется, что простой List<T>
или ArrayList
будет в порядке, где каждая запись является либо сокетом, либо, возможно, пользовательским типом, содержащим сокет и любую другую необходимую вам информацию.Похоже, вы не выполняете произвольный поиск на столе.