private void _server_ClientStatusChanged(object sender, ClientStatusChangedEventArgs args) { if (!IsRunning) { return; } long proxyClientID = args.ClientID; if (args.Status == ClientStatus.Connected) { TcpClientEx tcpClient = new TcpClientEx(RawPacketSpliter.Default); tcpClient.Tag = proxyClientID; tcpClient.ClientStatusChanged += TcpClient_ClientStatusChanged; tcpClient.MessageReceived += TcpClient_MessageReceived; Task.Factory.StartNew(() => { bool isConnected = tcpClient.Connect(RemoteIP, (ushort)RemotePort); if (isConnected) { bool isOK = _clientDict.TryAdd(proxyClientID, tcpClient); System.Diagnostics.Debug.Assert(isOK, "add new client failed"); } else { _server.CloseClient(proxyClientID); } if (_waitConnDict.ContainsKey(proxyClientID)) { _waitConnDict[proxyClientID].Set(); } }); } else if (args.Status == ClientStatus.Closed) { if (_clientDict.TryRemove(proxyClientID, out TcpClientEx client)) { client.Close(); } } ClientCount = _server.Clients.Count; if (ClientCountChanged != null) { ClientCountChangedEventArgs countChangedArgs = new ClientCountChangedEventArgs() { NewCount = ClientCount }; ClientCountChanged(this, countChangedArgs); } }