I need to hangle UserJoined sequentially, so I tried to implement locking. I don't have any experience with C# concurency, so maybe I did some basic mistake, but lock just doesn't seem to work properly. here is my code
- Code: Select all
private Object thisLock = new Object();
public override void UserJoined(Player player) {
lock (thisLock) {
Console.WriteLine("player joining");
player.username = "test"; // this is here only for testing purposes
Message postJoin = Message.Create(MessageID.LOBBY_POST_JOIN);
postJoin.Add(PlayerCount - 1);
foreach (Player p in Players) {
if (p.Id != player.Id) {
postJoin.Add(p.Id);
postJoin.Add(p.username);
}
}
player.Send(postJoin);
Broadcast(MessageID.LOBBY_PLAYER_JOINED, player.Id, player.username);
Console.WriteLine("joining finished");
}
}
Now when I try to connect with 3 clients output says
- Code: Select all
>User Guest613 (2): Joined game
>User Guest5737 (1): Joined game
player joining
>User Guest1573 (3): Joined game
player joining
player joining
joining finished
joining finished
joining finished
from what I understand it should be
- Code: Select all
player joining
joining finished
player joining
joining finished
...
second problem I have with locks is that sometimes player.Send(postJoin); throws exception
- Code: Select all
Error: String reference not set to an instance of a String.
Parameter name: s
at System.Text.Encoding.GetBytes(String s)
at PlayerIO.ServerCore.SocketLibrary.Message.a(b A_0)
at PlayerIO.ServerCore.SocketLibrary.Message.b()
at eg.Send(Message message)
at PlayerIO.GameLibrary.BasePlayer.Send(Message message)
at GameName.LobbyRoom.UserJoined(Player player) in [path]\Serverside Code\Game Code\LobbyRoom.cs:line 30
at PlayerIO.GameLibrary.Game`1.<AttemptSetup>b__a(BasePlayer player)
at me.a(e A_0, BasePlayer A_1, Message A_2, Action A_3)
Any ideas what might be wrong? same thing happens also in my game room when I try to use locks