mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-11-04 13:33:02 +08:00
Additional performance improvements
This commit is contained in:
@@ -85,7 +85,7 @@ namespace MQTTnet.Implementations
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var clientSocket = await Task.Factory.FromAsync(_defaultEndpointSocket.BeginAccept, _defaultEndpointSocket.EndAccept, null);
|
var clientSocket = await Task.Factory.FromAsync(_defaultEndpointSocket.BeginAccept, _defaultEndpointSocket.EndAccept, null).ConfigureAwait(false);
|
||||||
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer());
|
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer());
|
||||||
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ namespace MQTTnet.Implementations
|
|||||||
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at default endpoint.");
|
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at default endpoint.");
|
||||||
|
|
||||||
//excessive CPU consumed if in endless loop of socket errors
|
//excessive CPU consumed if in endless loop of socket errors
|
||||||
Thread.Sleep(TimeSpan.FromSeconds(1));
|
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,10 +105,10 @@ namespace MQTTnet.Implementations
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var clientSocket = await Task.Factory.FromAsync(_tlsEndpointSocket.BeginAccept, _tlsEndpointSocket.EndAccept, null);
|
var clientSocket = await Task.Factory.FromAsync(_tlsEndpointSocket.BeginAccept, _tlsEndpointSocket.EndAccept, null).ConfigureAwait(false);
|
||||||
|
|
||||||
var sslStream = new SslStream(new NetworkStream(clientSocket));
|
var sslStream = new SslStream(new NetworkStream(clientSocket));
|
||||||
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false);
|
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
|
||||||
|
|
||||||
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer());
|
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer());
|
||||||
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
||||||
@@ -118,7 +118,7 @@ namespace MQTTnet.Implementations
|
|||||||
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at TLS endpoint.");
|
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at TLS endpoint.");
|
||||||
|
|
||||||
//excessive CPU consumed if in endless loop of socket errors
|
//excessive CPU consumed if in endless loop of socket errors
|
||||||
Thread.Sleep(TimeSpan.FromSeconds(1));
|
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ namespace MQTTnet.Implementations
|
|||||||
_socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
|
_socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Factory.FromAsync(_socket.BeginConnect, _socket.EndConnect, options.Server, options.GetPort(), null);
|
await Task.Factory.FromAsync(_socket.BeginConnect, _socket.EndConnect, options.Server, options.GetPort(), null).ConfigureAwait(false);
|
||||||
|
|
||||||
if (options.TlsOptions.UseTls)
|
if (options.TlsOptions.UseTls)
|
||||||
{
|
{
|
||||||
@@ -99,12 +99,11 @@ namespace MQTTnet.Implementations
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int totalBytes = 0;
|
var totalBytes = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
var read = await _dataStream.ReadAsync(buffer, totalBytes, buffer.Length - totalBytes).ConfigureAwait(false);
|
var read = await _dataStream.ReadAsync(buffer, totalBytes, buffer.Length - totalBytes).ConfigureAwait(false);
|
||||||
|
|
||||||
if (read == 0)
|
if (read == 0)
|
||||||
{
|
{
|
||||||
throw new MqttCommunicationException(new SocketException((int)SocketError.Disconnecting));
|
throw new MqttCommunicationException(new SocketException((int)SocketError.Disconnecting));
|
||||||
|
|||||||
@@ -17,15 +17,14 @@ namespace MQTTnet.Implementations
|
|||||||
private int WebSocketBufferSize;
|
private int WebSocketBufferSize;
|
||||||
private int WebSocketBufferOffset;
|
private int WebSocketBufferOffset;
|
||||||
|
|
||||||
public async Task ConnectAsync(MqttClientOptions options)
|
public Task ConnectAsync(MqttClientOptions options)
|
||||||
{
|
{
|
||||||
_webSocket = null;
|
_webSocket = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_webSocket = new ClientWebSocket();
|
_webSocket = new ClientWebSocket();
|
||||||
|
return _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
||||||
await _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
|
||||||
}
|
}
|
||||||
catch (WebSocketException exception)
|
catch (WebSocketException exception)
|
||||||
{
|
{
|
||||||
@@ -33,9 +32,9 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisconnectAsync()
|
public Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
return _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
@@ -62,7 +61,7 @@ namespace MQTTnet.Implementations
|
|||||||
WebSocketReceiveResult response;
|
WebSocketReceiveResult response;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(temporaryBuffer), CancellationToken.None);
|
response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(temporaryBuffer), CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
temporaryBuffer.CopyTo(WebSocketBuffer, offset);
|
temporaryBuffer.CopyTo(WebSocketBuffer, offset);
|
||||||
offset += response.Count;
|
offset += response.Count;
|
||||||
@@ -72,7 +71,7 @@ namespace MQTTnet.Implementations
|
|||||||
WebSocketBufferSize = response.Count;
|
WebSocketBufferSize = response.Count;
|
||||||
if (response.MessageType == WebSocketMessageType.Close)
|
if (response.MessageType == WebSocketMessageType.Close)
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer.BlockCopy(WebSocketBuffer, 0, buffer, 0, buffer.Length);
|
Buffer.BlockCopy(WebSocketBuffer, 0, buffer, 0, buffer.Length);
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ namespace MQTTnet.Implementations
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var clientSocket = await _defaultEndpointSocket.AcceptAsync();
|
var clientSocket = await _defaultEndpointSocket.AcceptAsync().ConfigureAwait(false);
|
||||||
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer());
|
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, null), new MqttPacketSerializer());
|
||||||
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ namespace MQTTnet.Implementations
|
|||||||
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at default endpoint.");
|
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at default endpoint.");
|
||||||
|
|
||||||
//excessive CPU consumed if in endless loop of socket errors
|
//excessive CPU consumed if in endless loop of socket errors
|
||||||
Thread.Sleep(TimeSpan.FromSeconds(1));
|
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,10 +103,10 @@ namespace MQTTnet.Implementations
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var clientSocket = await _tlsEndpointSocket.AcceptAsync();
|
var clientSocket = await _tlsEndpointSocket.AcceptAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
var sslStream = new SslStream(new NetworkStream(clientSocket));
|
var sslStream = new SslStream(new NetworkStream(clientSocket));
|
||||||
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false);
|
await sslStream.AuthenticateAsServerAsync(_tlsCertificate, false, SslProtocols.Tls12, false).ConfigureAwait(false);
|
||||||
|
|
||||||
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer());
|
var clientAdapter = new MqttChannelCommunicationAdapter(new MqttTcpChannel(clientSocket, sslStream), new MqttPacketSerializer());
|
||||||
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
ClientConnected?.Invoke(this, new MqttClientConnectedEventArgs(clientSocket.RemoteEndPoint.ToString(), clientAdapter));
|
||||||
@@ -116,7 +116,7 @@ namespace MQTTnet.Implementations
|
|||||||
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at TLS endpoint.");
|
MqttTrace.Error(nameof(MqttServerAdapter), exception, "Error while accepting connection at TLS endpoint.");
|
||||||
|
|
||||||
//excessive CPU consumed if in endless loop of socket errors
|
//excessive CPU consumed if in endless loop of socket errors
|
||||||
Thread.Sleep(TimeSpan.FromSeconds(1));
|
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ namespace MQTTnet.Implementations
|
|||||||
public async Task ConnectAsync(MqttClientOptions options)
|
public async Task ConnectAsync(MqttClientOptions options)
|
||||||
{
|
{
|
||||||
if (options == null) throw new ArgumentNullException(nameof(options));
|
if (options == null) throw new ArgumentNullException(nameof(options));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_socket == null)
|
if (_socket == null)
|
||||||
@@ -97,12 +98,11 @@ namespace MQTTnet.Implementations
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int totalBytes = 0;
|
var totalBytes = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
var read = await _dataStream.ReadAsync(buffer, totalBytes, buffer.Length - totalBytes).ConfigureAwait(false);
|
var read = await _dataStream.ReadAsync(buffer, totalBytes, buffer.Length - totalBytes).ConfigureAwait(false);
|
||||||
|
|
||||||
if (read == 0)
|
if (read == 0)
|
||||||
{
|
{
|
||||||
throw new MqttCommunicationException(new SocketException((int)SocketError.Disconnecting));
|
throw new MqttCommunicationException(new SocketException((int)SocketError.Disconnecting));
|
||||||
|
|||||||
@@ -17,15 +17,14 @@ namespace MQTTnet.Implementations
|
|||||||
private int WebSocketBufferSize;
|
private int WebSocketBufferSize;
|
||||||
private int WebSocketBufferOffset;
|
private int WebSocketBufferOffset;
|
||||||
|
|
||||||
public async Task ConnectAsync(MqttClientOptions options)
|
public Task ConnectAsync(MqttClientOptions options)
|
||||||
{
|
{
|
||||||
_webSocket = null;
|
_webSocket = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_webSocket = new ClientWebSocket();
|
_webSocket = new ClientWebSocket();
|
||||||
|
return _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
||||||
await _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
|
||||||
}
|
}
|
||||||
catch (WebSocketException exception)
|
catch (WebSocketException exception)
|
||||||
{
|
{
|
||||||
@@ -33,9 +32,9 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisconnectAsync()
|
public Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
return _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
@@ -62,7 +61,7 @@ namespace MQTTnet.Implementations
|
|||||||
WebSocketReceiveResult response;
|
WebSocketReceiveResult response;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(temporaryBuffer), CancellationToken.None);
|
response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(temporaryBuffer), CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
temporaryBuffer.CopyTo(WebSocketBuffer, offset);
|
temporaryBuffer.CopyTo(WebSocketBuffer, offset);
|
||||||
offset += response.Count;
|
offset += response.Count;
|
||||||
@@ -72,7 +71,7 @@ namespace MQTTnet.Implementations
|
|||||||
WebSocketBufferSize = response.Count;
|
WebSocketBufferSize = response.Count;
|
||||||
if (response.MessageType == WebSocketMessageType.Close)
|
if (response.MessageType == WebSocketMessageType.Close)
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer.BlockCopy(WebSocketBuffer, 0, buffer, 0, buffer.Length);
|
Buffer.BlockCopy(WebSocketBuffer, 0, buffer, 0, buffer.Length);
|
||||||
|
|||||||
@@ -17,15 +17,14 @@ namespace MQTTnet.Implementations
|
|||||||
private int WebSocketBufferSize;
|
private int WebSocketBufferSize;
|
||||||
private int WebSocketBufferOffset;
|
private int WebSocketBufferOffset;
|
||||||
|
|
||||||
public async Task ConnectAsync(MqttClientOptions options)
|
public Task ConnectAsync(MqttClientOptions options)
|
||||||
{
|
{
|
||||||
_webSocket = null;
|
_webSocket = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_webSocket = new ClientWebSocket();
|
_webSocket = new ClientWebSocket();
|
||||||
|
return _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
||||||
await _webSocket.ConnectAsync(new Uri(options.Server), CancellationToken.None);
|
|
||||||
}
|
}
|
||||||
catch (WebSocketException exception)
|
catch (WebSocketException exception)
|
||||||
{
|
{
|
||||||
@@ -33,9 +32,9 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisconnectAsync()
|
public Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
return _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|||||||
@@ -43,11 +43,11 @@ namespace MQTTnet.Core.Adapter
|
|||||||
MqttBasePacket packet;
|
MqttBasePacket packet;
|
||||||
if (timeout > TimeSpan.Zero)
|
if (timeout > TimeSpan.Zero)
|
||||||
{
|
{
|
||||||
packet = await ExecuteWithTimeoutAsync(PacketSerializer.DeserializeAsync(_channel), timeout);
|
packet = await ExecuteWithTimeoutAsync(PacketSerializer.DeserializeAsync(_channel), timeout).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
packet = await PacketSerializer.DeserializeAsync(_channel);
|
packet = await PacketSerializer.DeserializeAsync(_channel).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet == null)
|
if (packet == null)
|
||||||
@@ -62,7 +62,7 @@ namespace MQTTnet.Core.Adapter
|
|||||||
private static async Task<TResult> ExecuteWithTimeoutAsync<TResult>(Task<TResult> task, TimeSpan timeout)
|
private static async Task<TResult> ExecuteWithTimeoutAsync<TResult>(Task<TResult> task, TimeSpan timeout)
|
||||||
{
|
{
|
||||||
var timeoutTask = Task.Delay(timeout);
|
var timeoutTask = Task.Delay(timeout);
|
||||||
if (await Task.WhenAny(timeoutTask, task) == timeoutTask)
|
if (await Task.WhenAny(timeoutTask, task).ConfigureAwait(false) == timeoutTask)
|
||||||
{
|
{
|
||||||
throw new MqttCommunicationTimedOutException();
|
throw new MqttCommunicationTimedOutException();
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ namespace MQTTnet.Core.Adapter
|
|||||||
private static async Task ExecuteWithTimeoutAsync(Task task, TimeSpan timeout)
|
private static async Task ExecuteWithTimeoutAsync(Task task, TimeSpan timeout)
|
||||||
{
|
{
|
||||||
var timeoutTask = Task.Delay(timeout);
|
var timeoutTask = Task.Delay(timeout);
|
||||||
if (await Task.WhenAny(timeoutTask, task) == timeoutTask)
|
if (await Task.WhenAny(timeoutTask, task).ConfigureAwait(false) == timeoutTask)
|
||||||
{
|
{
|
||||||
throw new MqttCommunicationTimedOutException();
|
throw new MqttCommunicationTimedOutException();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ namespace MQTTnet.Core.Client
|
|||||||
{
|
{
|
||||||
_disconnectedEventSuspended = false;
|
_disconnectedEventSuspended = false;
|
||||||
|
|
||||||
await _adapter.ConnectAsync(_options, _options.DefaultCommunicationTimeout);
|
await _adapter.ConnectAsync(_options, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
|
|
||||||
MqttTrace.Verbose(nameof(MqttClient), "Connection with server established.");
|
MqttTrace.Verbose(nameof(MqttClient), "Connection with server established.");
|
||||||
|
|
||||||
@@ -73,10 +73,10 @@ namespace MQTTnet.Core.Client
|
|||||||
|
|
||||||
StartReceivePackets();
|
StartReceivePackets();
|
||||||
|
|
||||||
var response = await SendAndReceiveAsync<MqttConnAckPacket>(connectPacket);
|
var response = await SendAndReceiveAsync<MqttConnAckPacket>(connectPacket).ConfigureAwait(false);
|
||||||
if (response.ConnectReturnCode != MqttConnectReturnCode.ConnectionAccepted)
|
if (response.ConnectReturnCode != MqttConnectReturnCode.ConnectionAccepted)
|
||||||
{
|
{
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
throw new MqttConnectingFailedException(response.ConnectReturnCode);
|
throw new MqttConnectingFailedException(response.ConnectReturnCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ namespace MQTTnet.Core.Client
|
|||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,11 +101,11 @@ namespace MQTTnet.Core.Client
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await SendAsync(new MqttDisconnectPacket());
|
await SendAsync(new MqttDisconnectPacket()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ namespace MQTTnet.Core.Client
|
|||||||
TopicFilters = topicFilters
|
TopicFilters = topicFilters
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await SendAndReceiveAsync<MqttSubAckPacket>(subscribePacket);
|
var response = await SendAndReceiveAsync<MqttSubAckPacket>(subscribePacket).ConfigureAwait(false);
|
||||||
|
|
||||||
if (response.SubscribeReturnCodes.Count != topicFilters.Count)
|
if (response.SubscribeReturnCodes.Count != topicFilters.Count)
|
||||||
{
|
{
|
||||||
@@ -191,8 +191,8 @@ namespace MQTTnet.Core.Client
|
|||||||
|
|
||||||
private async Task PublishExactlyOncePacketAsync(MqttBasePacket publishPacket)
|
private async Task PublishExactlyOncePacketAsync(MqttBasePacket publishPacket)
|
||||||
{
|
{
|
||||||
var pubRecPacket = await SendAndReceiveAsync<MqttPubRecPacket>(publishPacket);
|
var pubRecPacket = await SendAndReceiveAsync<MqttPubRecPacket>(publishPacket).ConfigureAwait(false);
|
||||||
await SendAndReceiveAsync<MqttPubCompPacket>(pubRecPacket.CreateResponse<MqttPubRelPacket>());
|
await SendAndReceiveAsync<MqttPubCompPacket>(pubRecPacket.CreateResponse<MqttPubRelPacket>()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ThrowIfNotConnected()
|
private void ThrowIfNotConnected()
|
||||||
@@ -200,15 +200,16 @@ namespace MQTTnet.Core.Client
|
|||||||
if (!IsConnected) throw new MqttCommunicationException("The client is not connected.");
|
if (!IsConnected) throw new MqttCommunicationException("The client is not connected.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DisconnectInternalAsync()
|
private Task DisconnectInternalAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _adapter.DisconnectAsync();
|
return _adapter.DisconnectAsync();
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
MqttTrace.Warning(nameof(MqttClient), exception, "Error while disconnecting.");
|
MqttTrace.Warning(nameof(MqttClient), exception, "Error while disconnecting.");
|
||||||
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -335,8 +336,8 @@ namespace MQTTnet.Core.Client
|
|||||||
return pi1.PacketIdentifier == pi2.PacketIdentifier;
|
return pi1.PacketIdentifier == pi2.PacketIdentifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _adapter.SendPacketAsync(requestPacket, _options.DefaultCommunicationTimeout);
|
await _adapter.SendPacketAsync(requestPacket, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
return (TResponsePacket)await _packetDispatcher.WaitForPacketAsync(ResponsePacketSelector, _options.DefaultCommunicationTimeout);
|
return (TResponsePacket)await _packetDispatcher.WaitForPacketAsync(ResponsePacketSelector, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ushort GetNewPacketIdentifier()
|
private ushort GetNewPacketIdentifier()
|
||||||
@@ -352,19 +353,19 @@ namespace MQTTnet.Core.Client
|
|||||||
{
|
{
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
await Task.Delay(_options.KeepAlivePeriod, cancellationToken);
|
await Task.Delay(_options.KeepAlivePeriod, cancellationToken).ConfigureAwait(false);
|
||||||
await SendAndReceiveAsync<MqttPingRespPacket>(new MqttPingReqPacket());
|
await SendAndReceiveAsync<MqttPingRespPacket>(new MqttPingReqPacket()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (MqttCommunicationException exception)
|
catch (MqttCommunicationException exception)
|
||||||
{
|
{
|
||||||
MqttTrace.Warning(nameof(MqttClient), exception, "MQTT communication error while receiving packets.");
|
MqttTrace.Warning(nameof(MqttClient), exception, "MQTT communication error while receiving packets.");
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
MqttTrace.Warning(nameof(MqttClient), exception, "Error while sending/receiving keep alive packets.");
|
MqttTrace.Warning(nameof(MqttClient), exception, "Error while sending/receiving keep alive packets.");
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -379,7 +380,7 @@ namespace MQTTnet.Core.Client
|
|||||||
{
|
{
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
var packet = await _adapter.ReceivePacketAsync(TimeSpan.Zero);
|
var packet = await _adapter.ReceivePacketAsync(TimeSpan.Zero).ConfigureAwait(false);
|
||||||
MqttTrace.Information(nameof(MqttClient), "Received <<< {0}", packet);
|
MqttTrace.Information(nameof(MqttClient), "Received <<< {0}", packet);
|
||||||
|
|
||||||
StartProcessReceivedPacket(packet, cancellationToken);
|
StartProcessReceivedPacket(packet, cancellationToken);
|
||||||
@@ -388,12 +389,12 @@ namespace MQTTnet.Core.Client
|
|||||||
catch (MqttCommunicationException exception)
|
catch (MqttCommunicationException exception)
|
||||||
{
|
{
|
||||||
MqttTrace.Warning(nameof(MqttClient), exception, "MQTT communication exception while receiving packets.");
|
MqttTrace.Warning(nameof(MqttClient), exception, "MQTT communication exception while receiving packets.");
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
MqttTrace.Error(nameof(MqttClient), exception, "Unhandled exception while receiving packets.");
|
MqttTrace.Error(nameof(MqttClient), exception, "Unhandled exception while receiving packets.");
|
||||||
await DisconnectInternalAsync();
|
await DisconnectInternalAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace MQTTnet.Core.Client
|
|||||||
var packetAwaiter = AddPacketAwaiter(selector);
|
var packetAwaiter = AddPacketAwaiter(selector);
|
||||||
DispatchPendingPackets();
|
DispatchPendingPackets();
|
||||||
|
|
||||||
var hasTimeout = await Task.WhenAny(Task.Delay(timeout), packetAwaiter.Task) != packetAwaiter.Task;
|
var hasTimeout = await Task.WhenAny(Task.Delay(timeout), packetAwaiter.Task).ConfigureAwait(false) != packetAwaiter.Task;
|
||||||
RemovePacketAwaiter(packetAwaiter);
|
RemovePacketAwaiter(packetAwaiter);
|
||||||
|
|
||||||
if (hasTimeout)
|
if (hasTimeout)
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ namespace MQTTnet.Core.Serializer
|
|||||||
|
|
||||||
public async Task ReadToEndAsync()
|
public async Task ReadToEndAsync()
|
||||||
{
|
{
|
||||||
await ReadFixedHeaderAsync();
|
await ReadFixedHeaderAsync().ConfigureAwait(false);
|
||||||
await ReadRemainingLengthAsync();
|
await ReadRemainingLengthAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
if (_remainingLength == 0)
|
if (_remainingLength == 0)
|
||||||
{
|
{
|
||||||
@@ -37,7 +37,7 @@ namespace MQTTnet.Core.Serializer
|
|||||||
}
|
}
|
||||||
|
|
||||||
var buffer = new byte[_remainingLength];
|
var buffer = new byte[_remainingLength];
|
||||||
await ReadFromSourceAsync(buffer);
|
await ReadFromSourceAsync(buffer).ConfigureAwait(false);
|
||||||
|
|
||||||
_remainingData.Write(buffer, 0, buffer.Length);
|
_remainingData.Write(buffer, 0, buffer.Length);
|
||||||
_remainingData.Position = 0;
|
_remainingData.Position = 0;
|
||||||
@@ -91,7 +91,7 @@ namespace MQTTnet.Core.Serializer
|
|||||||
byte encodedByte;
|
byte encodedByte;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
encodedByte = await ReadStreamByteAsync();
|
encodedByte = await ReadStreamByteAsync().ConfigureAwait(false);
|
||||||
value += (encodedByte & 127) * multiplier;
|
value += (encodedByte & 127) * multiplier;
|
||||||
multiplier *= 128;
|
multiplier *= 128;
|
||||||
if (multiplier > 128 * 128 * 128)
|
if (multiplier > 128 * 128 * 128)
|
||||||
@@ -118,13 +118,13 @@ namespace MQTTnet.Core.Serializer
|
|||||||
private async Task<byte> ReadStreamByteAsync()
|
private async Task<byte> ReadStreamByteAsync()
|
||||||
{
|
{
|
||||||
var buffer = new byte[1];
|
var buffer = new byte[1];
|
||||||
await ReadFromSourceAsync(buffer);
|
await ReadFromSourceAsync(buffer).ConfigureAwait(false);
|
||||||
return buffer[0];
|
return buffer[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ReadFixedHeaderAsync()
|
private async Task ReadFixedHeaderAsync()
|
||||||
{
|
{
|
||||||
FixedHeader = await ReadStreamByteAsync();
|
FixedHeader = await ReadStreamByteAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
var byteReader = new ByteReader(FixedHeader);
|
var byteReader = new ByteReader(FixedHeader);
|
||||||
byteReader.Read(4);
|
byteReader.Read(4);
|
||||||
|
|||||||
@@ -457,7 +457,7 @@ namespace MQTTnet.Core.Serializer
|
|||||||
output.Write(packet.PacketIdentifier);
|
output.Write(packet.PacketIdentifier);
|
||||||
|
|
||||||
output.InjectFixedHeader(MqttControlPacketType.PubRel, 0x02);
|
output.InjectFixedHeader(MqttControlPacketType.PubRel, 0x02);
|
||||||
await output.WriteToAsync(destination);
|
await output.WriteToAsync(destination).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ namespace MQTTnet.Core.Server
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _gate.WaitOneAsync();
|
await _gate.WaitOneAsync().ConfigureAwait(false);
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -81,7 +81,7 @@ namespace MQTTnet.Core.Server
|
|||||||
|
|
||||||
foreach (var publishPacket in pendingPublishPackets)
|
foreach (var publishPacket in pendingPublishPackets)
|
||||||
{
|
{
|
||||||
await TrySendPendingPublishPacketAsync(publishPacket);
|
await TrySendPendingPublishPacketAsync(publishPacket).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -105,7 +105,7 @@ namespace MQTTnet.Core.Server
|
|||||||
}
|
}
|
||||||
|
|
||||||
publishPacketContext.PublishPacket.Dup = publishPacketContext.SendTries > 0;
|
publishPacketContext.PublishPacket.Dup = publishPacketContext.SendTries > 0;
|
||||||
await _adapter.SendPacketAsync(publishPacketContext.PublishPacket, _options.DefaultCommunicationTimeout);
|
await _adapter.SendPacketAsync(publishPacketContext.PublishPacket, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
|
|
||||||
publishPacketContext.IsSent = true;
|
publishPacketContext.IsSent = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ namespace MQTTnet.Core.Server
|
|||||||
_messageQueue.Start(adapter);
|
_messageQueue.Start(adapter);
|
||||||
while (!_cancellationTokenSource.IsCancellationRequested)
|
while (!_cancellationTokenSource.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
var packet = await adapter.ReceivePacketAsync(TimeSpan.Zero);
|
var packet = await adapter.ReceivePacketAsync(TimeSpan.Zero).ConfigureAwait(false);
|
||||||
await HandleIncomingPacketAsync(packet);
|
await HandleIncomingPacketAsync(packet).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (MqttCommunicationException)
|
catch (MqttCommunicationException)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace MQTTnet.Core.Server
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var connectPacket = await eventArgs.ClientAdapter.ReceivePacketAsync(_options.DefaultCommunicationTimeout) as MqttConnectPacket;
|
var connectPacket = await eventArgs.ClientAdapter.ReceivePacketAsync(_options.DefaultCommunicationTimeout).ConfigureAwait(false) as MqttConnectPacket;
|
||||||
if (connectPacket == null)
|
if (connectPacket == null)
|
||||||
{
|
{
|
||||||
throw new MqttProtocolViolationException("The first packet from a client must be a 'CONNECT' packet [MQTT-3.1.0-1].");
|
throw new MqttProtocolViolationException("The first packet from a client must be a 'CONNECT' packet [MQTT-3.1.0-1].");
|
||||||
@@ -43,7 +43,7 @@ namespace MQTTnet.Core.Server
|
|||||||
await eventArgs.ClientAdapter.SendPacketAsync(new MqttConnAckPacket
|
await eventArgs.ClientAdapter.SendPacketAsync(new MqttConnAckPacket
|
||||||
{
|
{
|
||||||
ConnectReturnCode = connectReturnCode
|
ConnectReturnCode = connectReturnCode
|
||||||
}, _options.DefaultCommunicationTimeout);
|
}, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -54,9 +54,9 @@ namespace MQTTnet.Core.Server
|
|||||||
{
|
{
|
||||||
ConnectReturnCode = connectReturnCode,
|
ConnectReturnCode = connectReturnCode,
|
||||||
IsSessionPresent = clientSession.IsExistingSession
|
IsSessionPresent = clientSession.IsExistingSession
|
||||||
}, _options.DefaultCommunicationTimeout);
|
}, _options.DefaultCommunicationTimeout).ConfigureAwait(false);
|
||||||
|
|
||||||
await clientSession.Session.RunAsync(eventArgs.Identifier, connectPacket.WillMessage, eventArgs.ClientAdapter);
|
await clientSession.Session.RunAsync(eventArgs.Identifier, connectPacket.WillMessage, eventArgs.ClientAdapter).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ namespace MQTTnet.Core.Server
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await eventArgs.ClientAdapter.DisconnectAsync();
|
await eventArgs.ClientAdapter.DisconnectAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -403,24 +403,24 @@ namespace MQTTnet.Core.Tests
|
|||||||
_stream.Position = 0;
|
_stream.Position = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ConnectAsync(MqttClientOptions options)
|
public Task ConnectAsync(MqttClientOptions options)
|
||||||
{
|
{
|
||||||
await Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisconnectAsync()
|
public Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
await Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WriteAsync(byte[] buffer)
|
public Task WriteAsync(byte[] buffer)
|
||||||
{
|
{
|
||||||
await _stream.WriteAsync(buffer, 0, buffer.Length);
|
return _stream.WriteAsync(buffer, 0, buffer.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ReadAsync(byte[] buffer)
|
public Task ReadAsync(byte[] buffer)
|
||||||
{
|
{
|
||||||
await _stream.ReadAsync(buffer, 0, buffer.Length);
|
return _stream.ReadAsync(buffer, 0, buffer.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] ToArray()
|
public byte[] ToArray()
|
||||||
@@ -429,7 +429,7 @@ namespace MQTTnet.Core.Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SerializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
|
private static void SerializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311)
|
||||||
{
|
{
|
||||||
var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion };
|
var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion };
|
||||||
var channel = new TestChannel();
|
var channel = new TestChannel();
|
||||||
@@ -439,7 +439,7 @@ namespace MQTTnet.Core.Tests
|
|||||||
Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(buffer));
|
Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value)
|
private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value)
|
||||||
{
|
{
|
||||||
var serializer = new MqttPacketSerializer();
|
var serializer = new MqttPacketSerializer();
|
||||||
|
|
||||||
|
|||||||
@@ -13,36 +13,36 @@ namespace MQTTnet.Core.Tests
|
|||||||
public class MqttServerTests
|
public class MqttServerTests
|
||||||
{
|
{
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task MqttServer_PublishSimple_AtMostOnce()
|
public void MqttServer_PublishSimple_AtMostOnce()
|
||||||
{
|
{
|
||||||
await TestPublishAsync(
|
TestPublishAsync(
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.AtMostOnce,
|
MqttQualityOfServiceLevel.AtMostOnce,
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.AtMostOnce,
|
MqttQualityOfServiceLevel.AtMostOnce,
|
||||||
1);
|
1).Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task MqttServer_PublishSimple_AtLeastOnce()
|
public void MqttServer_PublishSimple_AtLeastOnce()
|
||||||
{
|
{
|
||||||
await TestPublishAsync(
|
TestPublishAsync(
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.AtLeastOnce,
|
MqttQualityOfServiceLevel.AtLeastOnce,
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.AtLeastOnce,
|
MqttQualityOfServiceLevel.AtLeastOnce,
|
||||||
1);
|
1).Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task MqttServer_PublishSimple_ExactlyOnce()
|
public void MqttServer_PublishSimple_ExactlyOnce()
|
||||||
{
|
{
|
||||||
await TestPublishAsync(
|
TestPublishAsync(
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.ExactlyOnce,
|
MqttQualityOfServiceLevel.ExactlyOnce,
|
||||||
"A/B/C",
|
"A/B/C",
|
||||||
MqttQualityOfServiceLevel.ExactlyOnce,
|
MqttQualityOfServiceLevel.ExactlyOnce,
|
||||||
1);
|
1).Wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|||||||
@@ -16,29 +16,29 @@ namespace MQTTnet.Core.Tests
|
|||||||
|
|
||||||
public IMqttPacketSerializer PacketSerializer { get; } = new MqttPacketSerializer();
|
public IMqttPacketSerializer PacketSerializer { get; } = new MqttPacketSerializer();
|
||||||
|
|
||||||
public async Task ConnectAsync(MqttClientOptions options, TimeSpan timeout)
|
public Task ConnectAsync(MqttClientOptions options, TimeSpan timeout)
|
||||||
{
|
{
|
||||||
await Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisconnectAsync()
|
public Task DisconnectAsync()
|
||||||
{
|
{
|
||||||
await Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SendPacketAsync(MqttBasePacket packet, TimeSpan timeout)
|
public Task SendPacketAsync(MqttBasePacket packet, TimeSpan timeout)
|
||||||
{
|
{
|
||||||
ThrowIfPartnerIsNull();
|
ThrowIfPartnerIsNull();
|
||||||
|
|
||||||
Partner.SendPacketInternal(packet);
|
Partner.SendPacketInternal(packet);
|
||||||
await Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<MqttBasePacket> ReceivePacketAsync(TimeSpan timeout)
|
public Task<MqttBasePacket> ReceivePacketAsync(TimeSpan timeout)
|
||||||
{
|
{
|
||||||
ThrowIfPartnerIsNull();
|
ThrowIfPartnerIsNull();
|
||||||
|
|
||||||
return await Task.Run(() => _incomingPackets.Take());
|
return Task.Run(() => _incomingPackets.Take());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendPacketInternal(MqttBasePacket packet)
|
private void SendPacketInternal(MqttBasePacket packet)
|
||||||
|
|||||||
Reference in New Issue
Block a user