非同期ソケットを使用して c# でゲーム エミューを開発しています。現在、プログラムは List を使用してクライアントを格納しています。
クライアントがルームに参加すると、その特定のルームのすべてのユーザーを格納するローカル リストが作成されます (FindAll(x => x.room == this.room) を使用しています)。クライアントがルームを変更すると、クライアントが参加したルーム内の他のすべてのプレーヤーを通知するためにサーバーが特定のパケットを送信する必要があるため、このリストが必要です。
このようなもの:
var localist = Clients.FindAll(x=> x.room == this.room);
foreach(stateObj client_in_room in locallist)
{
client_in_room.sendPacket(...); //what if the client_in_room disconnected in the meanwhile?
}
クライアントが切断されると、そのクライアント (stateObj) が元のクライアント リストから削除され (そしてクライアント ソケットが閉じられ)、ConnectionFired と呼ばれるクライアントの揮発性ブール値が false に変更されます (ソケット操作を実行する前に、ユーザーがまだ接続されているかどうかを確認するためのものです)。 BeginSend など)。ルーム X に他のクライアントが参加しているときに、あるクライアントがルーム X から切断された場合はどうなりますか? 確かにローカルリストには残りますが、ConnectionFired bool はその値を変更しますか? そうではないと思います。メイン/元のリストにのみ影響します。
私の懸念は、それが発生した場合、サーバーが閉じたソケットにデータを送信しようとする可能性があることです (これをチェックする bool、ConnectionFire は、必要に応じてその値を変更しないため)。
このようなことを避けるには、リストの複製を避け、メイン リストで直接forを使用する必要がありますか? (コレクションが変更された例外を回避するために、最初にこのローカルリストのことを行いました)。