diff --git a/Source/MQTTnet/Internal/AsyncLock.cs b/Source/MQTTnet/Internal/AsyncLock.cs index d3c94f85..b5b614f6 100644 --- a/Source/MQTTnet/Internal/AsyncLock.cs +++ b/Source/MQTTnet/Internal/AsyncLock.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; namespace MQTTnet.Internal { - // From Stephen Toub (https://blogs.msdn.microsoft.com/pfxteam/2012/02/12/building-async-coordination-primitives-part-6-asynclock/) public sealed class AsyncLock : IDisposable { readonly object _syncRoot = new object(); @@ -24,10 +23,19 @@ namespace MQTTnet.Internal public Task WaitAsync(CancellationToken cancellationToken) { - var task = _semaphore.WaitAsync(cancellationToken); - if (task.Status == TaskStatus.RanToCompletion) + Task task; + lock (_syncRoot) { - return _releaser; + if (_semaphore == null) + { + throw new ObjectDisposedException("The AsyncLock is disposed."); + } + + task = _semaphore.WaitAsync(cancellationToken); + if (task.Status == TaskStatus.RanToCompletion) + { + return _releaser; + } } return task.ContinueWith( diff --git a/Tests/MQTTnet.Core.Tests/ManagedMqttClient_Tests.cs b/Tests/MQTTnet.Core.Tests/ManagedMqttClient_Tests.cs index d2586005..a9a8bfdd 100644 --- a/Tests/MQTTnet.Core.Tests/ManagedMqttClient_Tests.cs +++ b/Tests/MQTTnet.Core.Tests/ManagedMqttClient_Tests.cs @@ -59,9 +59,7 @@ namespace MQTTnet.Tests using (var testEnvironment = new TestEnvironment(TestContext)) { var receivedMessagesCount = 0; - - var factory = new MqttFactory(); - + await testEnvironment.StartServerAsync(); var willMessage = new MqttApplicationMessageBuilder().WithTopic("My/last/will").WithAtMostOnceQoS().Build(); @@ -92,8 +90,6 @@ namespace MQTTnet.Tests { using (var testEnvironment = new TestEnvironment(TestContext)) { - var factory = new MqttFactory(); - var server = await testEnvironment.StartServerAsync(); var managedClient = new ManagedMqttClient(testEnvironment.CreateClient(), new MqttNetLogger()); @@ -124,9 +120,7 @@ namespace MQTTnet.Tests testEnvironment.IgnoreClientLogErrors = true; testEnvironment.IgnoreServerLogErrors = true; - var factory = new MqttFactory(); - - var server = await testEnvironment.StartServerAsync(); + await testEnvironment.StartServerAsync(); var managedClient = new ManagedMqttClient(testEnvironment.CreateClient(), new MqttNetLogger()); var clientOptions = new MqttClientOptionsBuilder() @@ -314,11 +308,7 @@ namespace MQTTnet.Tests var clientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost", testEnvironment.ServerPort); - - var managedOptions = new ManagedMqttClientOptionsBuilder() - .WithClientOptions(clientOptions) - .Build(); - + var receivedManagedMessages = new List(); var managedClient = new ManagedMqttClient(testEnvironment.CreateClient(), new MqttNetLogger()); managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(c => @@ -359,7 +349,7 @@ namespace MQTTnet.Tests } } - private async Task CreateManagedClientAsync( + async Task CreateManagedClientAsync( TestEnvironment testEnvironment, IMqttClient underlyingClient = null, TimeSpan? connectionCheckInterval = null) @@ -393,7 +383,7 @@ namespace MQTTnet.Tests /// /// Returns a task that will finish when the has connected /// - private Task GetConnectedTask(ManagedMqttClient managedClient) + Task GetConnectedTask(ManagedMqttClient managedClient) { TaskCompletionSource connected = new TaskCompletionSource(); managedClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(e => @@ -408,7 +398,7 @@ namespace MQTTnet.Tests /// Returns a task that will return the messages received on /// when have been received /// - private Task> SetupReceivingOfMessages(ManagedMqttClient managedClient, int expectedNumberOfMessages) + Task> SetupReceivingOfMessages(ManagedMqttClient managedClient, int expectedNumberOfMessages) { var receivedMessages = new List(); var allReceived = new TaskCompletionSource>(); @@ -420,13 +410,14 @@ namespace MQTTnet.Tests allReceived.SetResult(receivedMessages); } }); + return allReceived.Task; } } public class ManagedMqttClientTestStorage : IManagedMqttClientStorage { - private IList _messages = null; + IList _messages; public Task> LoadQueuedMessagesAsync() { @@ -434,6 +425,7 @@ namespace MQTTnet.Tests { _messages = new List(); } + return Task.FromResult(_messages); }