private void OnAccept(IAsyncResult ar) { if (Guard.EnterExecute()) { Socket socket = ar.AsyncState as Socket; Socket acceptedSocket = socket.EndAccept(ar); try { // set socket to accept another connection socket.BeginAccept(OnAccept, socket); var serverClient = new SocketClient(acceptedSocket); lock (Clients) { Clients[serverClient.Id] = serverClient; serverClient.Start(DoStart, DoClientMessage, DoClientStopped); } } finally { Guard.ExitExecute(); } } }