mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-20 19:58:57 +08:00
if we wait before sending the packets we dont need to store the received packets at all because the awaiter will always be there or is already canceled
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MQTTnet.Core.Diagnostics;
|
using MQTTnet.Core.Diagnostics;
|
||||||
using MQTTnet.Core.Exceptions;
|
using MQTTnet.Core.Exceptions;
|
||||||
@@ -11,8 +10,6 @@ namespace MQTTnet.Core.Client
|
|||||||
{
|
{
|
||||||
public class MqttPacketDispatcher
|
public class MqttPacketDispatcher
|
||||||
{
|
{
|
||||||
private readonly object _syncRoot = new object();
|
|
||||||
private readonly HashSet<MqttBasePacket> _receivedPackets = new HashSet<MqttBasePacket>();
|
|
||||||
private readonly ConcurrentDictionary<Type, TaskCompletionSource<MqttBasePacket>> _packetByResponseType = new ConcurrentDictionary<Type, TaskCompletionSource<MqttBasePacket>>();
|
private readonly ConcurrentDictionary<Type, TaskCompletionSource<MqttBasePacket>> _packetByResponseType = new ConcurrentDictionary<Type, TaskCompletionSource<MqttBasePacket>>();
|
||||||
private readonly ConcurrentDictionary<Type, ConcurrentDictionary<ushort,TaskCompletionSource<MqttBasePacket>>> _packetByResponseTypeAndIdentifier = new ConcurrentDictionary<Type, ConcurrentDictionary<ushort,TaskCompletionSource<MqttBasePacket>>>();
|
private readonly ConcurrentDictionary<Type, ConcurrentDictionary<ushort,TaskCompletionSource<MqttBasePacket>>> _packetByResponseTypeAndIdentifier = new ConcurrentDictionary<Type, ConcurrentDictionary<ushort,TaskCompletionSource<MqttBasePacket>>>();
|
||||||
|
|
||||||
@@ -21,8 +18,6 @@ namespace MQTTnet.Core.Client
|
|||||||
if (request == null) throw new ArgumentNullException(nameof(request));
|
if (request == null) throw new ArgumentNullException(nameof(request));
|
||||||
|
|
||||||
var packetAwaiter = AddPacketAwaiter(request, responseType);
|
var packetAwaiter = AddPacketAwaiter(request, responseType);
|
||||||
DispatchPendingPackets();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return await packetAwaiter.Task.TimeoutAfter(timeout);
|
return await packetAwaiter.Task.TimeoutAfter(timeout);
|
||||||
@@ -43,8 +38,6 @@ namespace MQTTnet.Core.Client
|
|||||||
if (packet == null) throw new ArgumentNullException(nameof(packet));
|
if (packet == null) throw new ArgumentNullException(nameof(packet));
|
||||||
|
|
||||||
var type = packet.GetType();
|
var type = packet.GetType();
|
||||||
var packetDispatched = false;
|
|
||||||
|
|
||||||
if (packet is IMqttPacketWithIdentifier withIdentifier)
|
if (packet is IMqttPacketWithIdentifier withIdentifier)
|
||||||
{
|
{
|
||||||
if (_packetByResponseTypeAndIdentifier.TryGetValue(type, out var byid))
|
if (_packetByResponseTypeAndIdentifier.TryGetValue(type, out var byid))
|
||||||
@@ -52,37 +45,19 @@ namespace MQTTnet.Core.Client
|
|||||||
if (byid.TryRemove( withIdentifier.PacketIdentifier, out var tcs))
|
if (byid.TryRemove( withIdentifier.PacketIdentifier, out var tcs))
|
||||||
{
|
{
|
||||||
tcs.TrySetResult( packet );
|
tcs.TrySetResult( packet );
|
||||||
packetDispatched = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (_packetByResponseType.TryRemove(type, out var tcs))
|
else if (_packetByResponseType.TryRemove(type, out var tcs))
|
||||||
{
|
{
|
||||||
tcs.TrySetResult(packet);
|
tcs.TrySetResult(packet);
|
||||||
packetDispatched = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
lock (_syncRoot)
|
|
||||||
{
|
|
||||||
if (!packetDispatched)
|
|
||||||
{
|
|
||||||
_receivedPackets.Add(packet);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_receivedPackets.Remove(packet);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reset()
|
public void Reset()
|
||||||
{
|
{
|
||||||
lock (_syncRoot)
|
|
||||||
{
|
|
||||||
_receivedPackets.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
_packetByResponseTypeAndIdentifier.Clear();
|
_packetByResponseTypeAndIdentifier.Clear();
|
||||||
|
_packetByResponseType.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private TaskCompletionSource<MqttBasePacket> AddPacketAwaiter(MqttBasePacket request, Type responseType)
|
private TaskCompletionSource<MqttBasePacket> AddPacketAwaiter(MqttBasePacket request, Type responseType)
|
||||||
@@ -113,19 +88,5 @@ namespace MQTTnet.Core.Client
|
|||||||
_packetByResponseType.TryRemove(responseType, out var _);
|
_packetByResponseType.TryRemove(responseType, out var _);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DispatchPendingPackets()
|
|
||||||
{
|
|
||||||
List<MqttBasePacket> receivedPackets;
|
|
||||||
lock (_syncRoot)
|
|
||||||
{
|
|
||||||
receivedPackets = new List<MqttBasePacket>(_receivedPackets);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var pendingPacket in receivedPackets)
|
|
||||||
{
|
|
||||||
Dispatch(pendingPacket);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user