mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-18 18:43:10 +08:00
Replace the Async coordination primitives
This commit is contained in:
@@ -154,7 +154,6 @@ namespace MQTTnet.Server
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_queueAutoResetEvent?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,8 +119,7 @@ namespace MQTTnet.Server
|
||||
|
||||
public async Task StopAsync()
|
||||
{
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
foreach (var session in _sessions)
|
||||
{
|
||||
@@ -129,16 +128,11 @@ namespace MQTTnet.Server
|
||||
|
||||
_sessions.Clear();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IList<ConnectedMqttClient>> GetConnectedClientsAsync()
|
||||
{
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
return _sessions.Where(s => s.Value.IsConnected).Select(s => new ConnectedMqttClient
|
||||
{
|
||||
@@ -149,10 +143,6 @@ namespace MQTTnet.Server
|
||||
PendingApplicationMessages = s.Value.PendingMessagesQueue.Count
|
||||
}).ToList();
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public void StartDispatchApplicationMessage(MqttClientSession senderClientSession, MqttApplicationMessage applicationMessage)
|
||||
@@ -165,8 +155,7 @@ namespace MQTTnet.Server
|
||||
if (clientId == null) throw new ArgumentNullException(nameof(clientId));
|
||||
if (topicFilters == null) throw new ArgumentNullException(nameof(topicFilters));
|
||||
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
if (!_sessions.TryGetValue(clientId, out var session))
|
||||
{
|
||||
@@ -175,10 +164,6 @@ namespace MQTTnet.Server
|
||||
|
||||
await session.SubscribeAsync(topicFilters).ConfigureAwait(false);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task UnsubscribeAsync(string clientId, IList<string> topicFilters)
|
||||
@@ -186,8 +171,7 @@ namespace MQTTnet.Server
|
||||
if (clientId == null) throw new ArgumentNullException(nameof(clientId));
|
||||
if (topicFilters == null) throw new ArgumentNullException(nameof(topicFilters));
|
||||
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
if (!_sessions.TryGetValue(clientId, out var session))
|
||||
{
|
||||
@@ -196,15 +180,10 @@ namespace MQTTnet.Server
|
||||
|
||||
await session.UnsubscribeAsync(topicFilters).ConfigureAwait(false);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_sessionsLock?.Dispose();
|
||||
}
|
||||
|
||||
private MqttConnectReturnCode ValidateConnection(MqttConnectPacket connectPacket)
|
||||
@@ -226,8 +205,8 @@ namespace MQTTnet.Server
|
||||
|
||||
private async Task<GetOrCreateClientSessionResult> PrepareClientSessionAsync(MqttConnectPacket connectPacket)
|
||||
{
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
|
||||
{
|
||||
var isSessionPresent = _sessions.TryGetValue(connectPacket.ClientId, out var clientSession);
|
||||
if (isSessionPresent)
|
||||
@@ -261,10 +240,6 @@ namespace MQTTnet.Server
|
||||
|
||||
return new GetOrCreateClientSessionResult { IsExistingSession = isExistingSession, Session = clientSession };
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task DispatchApplicationMessageAsync(MqttClientSession senderClientSession, MqttApplicationMessage applicationMessage)
|
||||
@@ -294,18 +269,13 @@ namespace MQTTnet.Server
|
||||
_logger.Error(exception, "Error while processing application message");
|
||||
}
|
||||
|
||||
await _sessionsLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _sessionsLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
foreach (var clientSession in _sessions.Values)
|
||||
{
|
||||
await clientSession.EnqueueApplicationMessageAsync(applicationMessage).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_sessionsLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
private MqttApplicationMessageInterceptorContext InterceptApplicationMessage(MqttClientSession senderClientSession, MqttApplicationMessage applicationMessage)
|
||||
|
||||
@@ -29,24 +29,22 @@ namespace MQTTnet.Server
|
||||
return;
|
||||
}
|
||||
|
||||
await _messagesLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _messagesLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
var retainedMessages = await _options.Storage.LoadRetainedMessagesAsync().ConfigureAwait(false);
|
||||
|
||||
_messages.Clear();
|
||||
foreach (var retainedMessage in retainedMessages)
|
||||
try
|
||||
{
|
||||
_messages[retainedMessage.Topic] = retainedMessage;
|
||||
var retainedMessages = await _options.Storage.LoadRetainedMessagesAsync().ConfigureAwait(false);
|
||||
|
||||
_messages.Clear();
|
||||
foreach (var retainedMessage in retainedMessages)
|
||||
{
|
||||
_messages[retainedMessage.Topic] = retainedMessage;
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.Error(exception, "Unhandled exception while loading retained messages.");
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.Error(exception, "Unhandled exception while loading retained messages.");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_messagesLock.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,18 +52,16 @@ namespace MQTTnet.Server
|
||||
{
|
||||
if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage));
|
||||
|
||||
await _messagesLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _messagesLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
await HandleMessageInternalAsync(clientId, applicationMessage);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.Error(exception, "Unhandled exception while handling retained messages.");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_messagesLock.Exit();
|
||||
try
|
||||
{
|
||||
await HandleMessageInternalAsync(clientId, applicationMessage);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.Error(exception, "Unhandled exception while handling retained messages.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,8 +69,7 @@ namespace MQTTnet.Server
|
||||
{
|
||||
var retainedMessages = new List<MqttApplicationMessage>();
|
||||
|
||||
await _messagesLock.EnterAsync(CancellationToken.None).ConfigureAwait(false);
|
||||
try
|
||||
using (var releaser = await _messagesLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
|
||||
{
|
||||
foreach (var retainedMessage in _messages.Values)
|
||||
{
|
||||
@@ -90,17 +85,12 @@ namespace MQTTnet.Server
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_messagesLock.Exit();
|
||||
}
|
||||
|
||||
return retainedMessages;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_messagesLock?.Dispose();
|
||||
}
|
||||
|
||||
private async Task HandleMessageInternalAsync(string clientId, MqttApplicationMessage applicationMessage)
|
||||
|
||||
Reference in New Issue
Block a user