public static void C_ChatHandler(PacketSession session, IPacket packet) { C_Chat chatPacket = packet as C_Chat; ClientSession clientSession = session as ClientSession; if (clientSession.Room == null) { return; } GameRoom room = clientSession.Room; room.Push(() => room.Broadcast(clientSession, chatPacket.chat)); }
public static void C_ChatHandler(PacketSession packetSession, IPacket packet) { C_Chat chatPacket = packet as C_Chat; ClientSession clientSession = packetSession as ClientSession; if (clientSession.Room == null) { return; } // * 수정된 부분 // 이제 Broadcast를 바로 실행하지 않고, 해야 할 작업으로 JobQueue에 넘겨준다. // clientSession의 Room이 메모리 해제되거나 변경될 수 있으니, clientSession.Room을 별도의 변수에 저장하여 참조 카운트를 유지한다. GameRoom room = clientSession.Room; room.Push(() => { room.Broadcast(clientSession, chatPacket.chat); }); }