public async Task DispatchMessagesAsync() { while (true) { var receiveResult = await _udpClient.ReceiveAsync(); var acsReader = new ACSProtocolReader(receiveResult.Buffer); var packetId = acsReader.ReadByte(); switch (packetId) { case ACSProtocol.ACSP_ERROR: { var message = acsReader.ReadStringW(); OnError?.Invoke(packetId, message); } break; case ACSProtocol.ACSP_CHAT: { var eventData = new ChatEvent(acsReader); OnChat?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_CLIENT_LOADED: { var carId = acsReader.ReadByte(); OnClientLoaded?.Invoke(packetId, carId); } break; case ACSProtocol.ACSP_VERSION: { var protocolVersion = acsReader.ReadByte(); OnVersion?.Invoke(packetId, protocolVersion); } break; case ACSProtocol.ACSP_NEW_SESSION: { var eventData = new SessionInfoEvent(acsReader); OnNewSession?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_SESSION_INFO: { var eventData = new SessionInfoEvent(acsReader); OnSessionInfo?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_END_SESSION: { var reportFile = acsReader.ReadStringW(); OnEndSession?.Invoke(packetId, reportFile); } break; case ACSProtocol.ACSP_CLIENT_EVENT: { var eventData = new ClientEventEvent(acsReader); OnClientEvent?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_CAR_INFO: { var eventData = new CarInfoEvent(acsReader); OnCarInfo?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_CAR_UPDATE: { var eventData = new CarUpdateEvent(acsReader); OnCarUpdate?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_NEW_CONNECTION: { var eventData = new ConnectionEvent(acsReader); OnNewConnection?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_CONNECTION_CLOSED: { var eventData = new ConnectionEvent(acsReader); OnConnectionClosed?.Invoke(packetId, eventData); } break; case ACSProtocol.ACSP_LAP_COMPLETED: { var eventData = new LapCompletedEvent(acsReader); OnLapCompleted?.Invoke(packetId, eventData); } break; } } }