From eef2b974ab8e325adb030f279e03a362d31dc0e1 Mon Sep 17 00:00:00 2001 From: justcoding121 Date: Tue, 24 Apr 2018 11:02:17 -0400 Subject: [PATCH] Use semaphore slim async lock on dequeue task object --- EventHook/Helpers/AsyncConcurrentQueue.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/EventHook/Helpers/AsyncConcurrentQueue.cs b/EventHook/Helpers/AsyncConcurrentQueue.cs index 9ac2e02..488d9b0 100644 --- a/EventHook/Helpers/AsyncConcurrentQueue.cs +++ b/EventHook/Helpers/AsyncConcurrentQueue.cs @@ -17,10 +17,10 @@ internal class AsyncConcurrentQueue private readonly ConcurrentQueue queue = new ConcurrentQueue(); /// - /// Keeps any pending Dequeue task to wake up once data arrives + /// Wake up any pending dequeue task /// private TaskCompletionSource dequeueTask; - + private SemaphoreSlim @dequeueTaskLock = new SemaphoreSlim(1); private CancellationToken taskCancellationToken; internal AsyncConcurrentQueue(CancellationToken taskCancellationToken) @@ -36,8 +36,11 @@ internal void Enqueue(T value) { queue.Enqueue(value); - //wake up the dequeue task with result - dequeueTask?.TrySetResult(true); + //signal + dequeueTaskLock.Wait(); + dequeueTask.TrySetResult(true); + dequeueTaskLock.Release(); + } /// @@ -54,10 +57,13 @@ internal async Task DequeueAsync() return result; } + await dequeueTaskLock.WaitAsync(); dequeueTask = new TaskCompletionSource(); + dequeueTaskLock.Release(); + taskCancellationToken.Register(() => dequeueTask.TrySetCanceled()); await dequeueTask.Task; - + queue.TryDequeue(out result); return result; }