private async Task <TResponsePacket> SendAndReceiveAsync <TResponsePacket>(MqttBasePacket requestPacket, CancellationToken cancellationToken) where TResponsePacket : MqttBasePacket { cancellationToken.ThrowIfCancellationRequested(); _sendTracker.Restart(); ushort identifier = 0; if (requestPacket is IMqttPacketWithIdentifier packetWithIdentifier && packetWithIdentifier.PacketIdentifier.HasValue) { identifier = packetWithIdentifier.PacketIdentifier.Value; } var packetAwaiter = _packetDispatcher.AddPacketAwaiter <TResponsePacket>(identifier); try { await _adapter.SendPacketAsync(requestPacket, cancellationToken).ConfigureAwait(false); var respone = await Internal.TaskExtensions.TimeoutAfterAsync(ct => packetAwaiter.Task, _options.CommunicationTimeout, cancellationToken).ConfigureAwait(false); return((TResponsePacket)respone); } catch (MqttCommunicationTimedOutException) { _logger.Warning(null, "Timeout while waiting for packet of type '{0}'.", typeof(TResponsePacket).Namespace); throw; } finally { _packetDispatcher.RemovePacketAwaiter <TResponsePacket>(identifier); } }
private async Task <TResponsePacket> SendAndReceiveAsync <TResponsePacket>(MqttBasePacket requestPacket, CancellationToken cancellationToken) where TResponsePacket : MqttBasePacket { cancellationToken.ThrowIfCancellationRequested(); _sendTracker.Restart(); ushort identifier = 0; if (requestPacket is IMqttPacketWithIdentifier packetWithIdentifier && packetWithIdentifier.PacketIdentifier.HasValue) { identifier = packetWithIdentifier.PacketIdentifier.Value; } using (var packetAwaiter = _packetDispatcher.AddPacketAwaiter <TResponsePacket>(identifier)) { try { await _adapter.SendPacketAsync(requestPacket, Options.CommunicationTimeout, cancellationToken).ConfigureAwait(false); return(await packetAwaiter.WaitOneAsync(Options.CommunicationTimeout).ConfigureAwait(false)); } catch (MqttCommunicationTimedOutException) { _logger.Warning(null, "Timeout while waiting for packet of type '{0}'.", typeof(TResponsePacket).Name); throw; } } }