public Task StartClientAsync() { Task.Factory.StartNew(async() => { while (Socket.Connected) { var packetSize = BitConverter.ToInt32(await ReceiveBytesAsync(4)); var packetData = await ReceiveBytesAsync(packetSize); var packet = Activator.CreateInstance(typeof(RconResultPacket), packetData) as RconResultPacket; packet.Deserialize(); lock (_lockObj) { if (QueuedCommandPackets.ContainsKey(packet.PacketId)) { QueuedCommandPackets[packet.PacketId] = packet; } else { QueuedPackets.Add(packet); } } } }); return(Task.CompletedTask); }
public async Task <TPacket> ReceivePacketAsync <TPacket>(int expectedPacketId = -1) where TPacket : RconPacket { RconResultPacket packet = null; await Task.Run(() => { while (packet == null) { lock (_lockObj) { if (expectedPacketId != -1) { packet = QueuedCommandPackets.FirstOrDefault(x => x.Value != null && x.Value.PacketId == expectedPacketId).Value; } else { packet = QueuedPackets.FirstOrDefault(); } } } }); if (packet == null) { return(null); } lock (_lockObj) { if (packet != null) { if (QueuedCommandPackets.ContainsKey(packet.PacketId)) { QueuedCommandPackets.Remove(packet.PacketId, out var p); } else { QueuedPackets.Remove(packet); } } } var tPacket = Activator.CreateInstance(typeof(TPacket), packet.Buffer) as TPacket; tPacket.Deserialize(); return(tPacket); }