Forum C# lock() problem

lock() problem

Postby LostBytes » May 18th, 2011, 5:34 pm

Hello,

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
LostBytes
Paid Member
 
Posts: 20
Joined: May 17th, 2011, 7:41 pm

Re: lock() problem

Postby LostBytes » May 19th, 2011, 10:22 am

Turns out problem was that some of used methods spawned new thread inside lock, thus breaking lock. I moved everything non-lock-essential out of lock scope and seems to be working properly now.
LostBytes
Paid Member
 
Posts: 20
Joined: May 17th, 2011, 7:41 pm


Return to C#



cron