我使用 c# async socks 创建了一个游戏模拟程序。我需要同时删除/添加和对集合(包含客户端的列表)进行迭代。我目前正在使用“锁定”,但是,这是一个巨大的性能下降。我也不想使用“本地列表/副本”来保持列表是最新的。我听说过“ConcurrentBags”,但是,我不确定它们对于迭代的线程安全性(例如,如果一个线程从列表中删除一个元素,而另一个线程正在对其进行迭代!?)。
你有什么建议?
编辑:这是一种情况 ,即数据包被发送给房间中的所有用户
lock (parent.gameClientList)
{
for (int i = 0; i <= parent.gameClientList.Count() - 1; i++) if (parent.gameClientList[i].zoneId == zoneId) parent.gameClientList[i].SendXt(packetElements); //if room matches - SendXt sends a packet
}
当新客户端连接时
Client connectedClient = new Client(socket, this);
lock (gameClientList)
{
gameClientList.Add(connectedClient);
}
客户端断开连接时的情况相同。
我要求一个更好的选择(性能方面),因为锁会减慢一切。