private void ListenLoop(object o) { try { Debug.Message("EventServer의 배경쓰레드에서 반복문 진입."); while (!Halted) { TcpClient client = mListener.AcceptTcpClient(); EventClient eventClient = new EventClient(client, true); if (eventClient == null ? false : eventClient.IsOnline) { eventClient.Disconnected += HandleClientDisconnection; Clients.Add(eventClient); ClientConnected?.Invoke(this, new ClientConnectedEventArgs(eventClient)); } } } catch (Exception e) { Debug.Error($"EventServer의 배경쓰레드에서 예외 발생 : {e.Message}\n\n{e.StackTrace}"); Halt(); } finally { Debug.Message($"EventServer의 배경쓰레드에서 finally절 진입함."); // Halt 되었으므로 쓰레드가 정리됨. } }
private void HandleClientDisconnection(object sender, DisconnectedEventArgs e) { EventClient client = sender as EventClient; if (!Clients.Remove(client)) { throw new InvalidOperationException("연결이 끊긴 클라이언트를 컬렉션에서 제거하는데 실패하였습니다."); } }
public ClientConnectedEventArgs(EventClient client) { Client = client; }