diff --git a/Frameworks/MQTTnet.NetStandard/Internal/AsyncAutoResetEvent.cs b/Frameworks/MQTTnet.NetStandard/Internal/AsyncAutoResetEvent.cs index 0a304e6..a8fa852 100644 --- a/Frameworks/MQTTnet.NetStandard/Internal/AsyncAutoResetEvent.cs +++ b/Frameworks/MQTTnet.NetStandard/Internal/AsyncAutoResetEvent.cs @@ -12,7 +12,10 @@ namespace MQTTnet.Internal private bool isSignaled; - public AsyncAutoResetEvent(bool signaled = false) + public AsyncAutoResetEvent() : this(false) + { } + + public AsyncAutoResetEvent(bool signaled) { this.isSignaled = signaled; } @@ -56,7 +59,7 @@ namespace MQTTnet.Internal } } - Task winner = await Task.WhenAny(tcs.Task, Task.Delay(timeout, cancellationToken)); + Task winner = await Task.WhenAny(tcs.Task, Task.Delay(timeout, cancellationToken)).ConfigureAwait(false); if (winner == tcs.Task) { // The task was signaled. @@ -68,7 +71,7 @@ namespace MQTTnet.Internal // This is an O(n) operation since waiters is a LinkedList. lock (this.waiters) { - bool removed = this.waiters.Remove(tcs); + this.waiters.Remove(tcs); if (winner.Status == TaskStatus.Canceled) { throw new OperationCanceledException(cancellationToken); diff --git a/Frameworks/MQTTnet.NetStandard/Internal/AsyncLock.cs b/Frameworks/MQTTnet.NetStandard/Internal/AsyncLock.cs index d402949..5e60a6a 100644 --- a/Frameworks/MQTTnet.NetStandard/Internal/AsyncLock.cs +++ b/Frameworks/MQTTnet.NetStandard/Internal/AsyncLock.cs @@ -5,7 +5,7 @@ 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 + public sealed class AsyncLock : IDisposable { private readonly SemaphoreSlim m_semaphore = new SemaphoreSlim(1, 1); private readonly Task m_releaser; @@ -25,6 +25,11 @@ namespace MQTTnet.Internal TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } + public void Dispose() + { + this.m_semaphore?.Dispose(); + } + private sealed class Releaser : IDisposable { private readonly AsyncLock m_toRelease; diff --git a/Tests/MQTTnet.Core.Tests/AsyncAutoResentEventTests.cs b/Tests/MQTTnet.Core.Tests/AsyncAutoResentEventTests.cs index 879f925..a4909b4 100644 --- a/Tests/MQTTnet.Core.Tests/AsyncAutoResentEventTests.cs +++ b/Tests/MQTTnet.Core.Tests/AsyncAutoResentEventTests.cs @@ -10,7 +10,7 @@ namespace MQTTnet.Core.Tests // Inspired from the vs-threading tests (https://github.com/Microsoft/vs-threading/blob/master/src/Microsoft.VisualStudio.Threading.Tests/AsyncAutoResetEventTests.cs) public class AsyncAutoResetEventTests { - private AsyncAutoResetEvent evt; + private readonly AsyncAutoResetEvent evt; public AsyncAutoResetEventTests() { @@ -57,7 +57,7 @@ namespace MQTTnet.Core.Tests for (int i = 0; i < waiters.Length; i++) { this.evt.Set(); - await waiters[i]; + await waiters[i].ConfigureAwait(false); } } @@ -139,7 +139,7 @@ namespace MQTTnet.Core.Tests Assert.IsFalse(waitTask.IsCompleted); // Cancel the request and ensure that it propagates to the task. - await Task.Delay(1000); + await Task.Delay(1000).ConfigureAwait(false); try { waitTask.GetAwaiter().GetResult();