diff --git a/Source/MQTTnet/Server/MqttClientSession.cs b/Source/MQTTnet/Server/MqttClientSession.cs index 05d552cb..204bdea8 100644 --- a/Source/MQTTnet/Server/MqttClientSession.cs +++ b/Source/MQTTnet/Server/MqttClientSession.cs @@ -30,6 +30,7 @@ namespace MQTTnet.Server private bool _wasCleanDisconnect; private IMqttChannelAdapter _adapter; private Task _run; + private IDisposable _cleanupHandle; public MqttClientSession( string clientId, @@ -84,6 +85,10 @@ namespace MQTTnet.Server adapter.ReadingPacketCompleted += OnAdapterReadingPacketCompleted; _cancellationTokenSource = new CancellationTokenSource(); + + //woraround for https://github.com/dotnet/corefx/issues/24430 + _cleanupHandle = _cancellationTokenSource.Token.Register(() => Cleanup()); + //endworkaround _wasCleanDisconnect = false; _willMessage = connectPacket.WillMessage; @@ -129,20 +134,14 @@ namespace MQTTnet.Server { _adapter.ReadingPacketStarted -= OnAdapterReadingPacketStarted; _adapter.ReadingPacketCompleted -= OnAdapterReadingPacketCompleted; - - try - { - await _adapter.DisconnectAsync(_options.DefaultCommunicationTimeout, CancellationToken.None).ConfigureAwait(false); - _adapter.Dispose(); - } - catch (Exception exception) - { - _logger.Error(exception, exception.Message); - } + await Cleanup(); } _adapter = null; + _cleanupHandle?.Dispose(); + _cleanupHandle = null; + _cancellationTokenSource?.Dispose(); _cancellationTokenSource = null; } @@ -150,6 +149,19 @@ namespace MQTTnet.Server return _wasCleanDisconnect; } + private async Task Cleanup() + { + try + { + await _adapter.DisconnectAsync(_options.DefaultCommunicationTimeout, CancellationToken.None).ConfigureAwait(false); + _adapter.Dispose(); + } + catch (Exception exception) + { + _logger.Error(exception, exception.Message); + } + } + public void Stop(MqttClientDisconnectType type) { try diff --git a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs index 24626ab8..39259d0f 100644 --- a/Tests/MQTTnet.Core.Tests/MqttServerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttServerTests.cs @@ -253,11 +253,11 @@ namespace MQTTnet.Core.Tests await c1.ConnectAsync(clientOptions); - await Task.Delay(500); + await Task.Delay(100); await s.StopAsync(); - await Task.Delay(1000); + await Task.Delay(100); Assert.IsTrue(disconnectCalled); }