This repository was archived by the owner on Apr 21, 2021. It is now read-only.
File tree Expand file tree Collapse file tree 1 file changed +11
-5
lines changed Expand file tree Collapse file tree 1 file changed +11
-5
lines changed Original file line number Diff line number Diff line change @@ -17,10 +17,10 @@ internal class AsyncConcurrentQueue<T>
17
17
private readonly ConcurrentQueue < T > queue = new ConcurrentQueue < T > ( ) ;
18
18
19
19
/// <summary>
20
- /// Keeps any pending Dequeue task to wake up once data arrives
20
+ /// Wake up any pending dequeue task
21
21
/// </summary>
22
22
private TaskCompletionSource < bool > dequeueTask ;
23
-
23
+ private SemaphoreSlim @dequeueTaskLock = new SemaphoreSlim ( 1 ) ;
24
24
private CancellationToken taskCancellationToken ;
25
25
26
26
internal AsyncConcurrentQueue ( CancellationToken taskCancellationToken )
@@ -36,8 +36,11 @@ internal void Enqueue(T value)
36
36
{
37
37
queue . Enqueue ( value ) ;
38
38
39
- //wake up the dequeue task with result
40
- dequeueTask ? . TrySetResult ( true ) ;
39
+ //signal
40
+ dequeueTaskLock . Wait ( ) ;
41
+ dequeueTask . TrySetResult ( true ) ;
42
+ dequeueTaskLock . Release ( ) ;
43
+
41
44
}
42
45
43
46
/// <summary>
@@ -54,10 +57,13 @@ internal async Task<T> DequeueAsync()
54
57
return result ;
55
58
}
56
59
60
+ await dequeueTaskLock . WaitAsync ( ) ;
57
61
dequeueTask = new TaskCompletionSource < bool > ( ) ;
62
+ dequeueTaskLock . Release ( ) ;
63
+
58
64
taskCancellationToken . Register ( ( ) => dequeueTask . TrySetCanceled ( ) ) ;
59
65
await dequeueTask . Task ;
60
-
66
+
61
67
queue . TryDequeue ( out result ) ;
62
68
return result ;
63
69
}
You can’t perform that action at this time.
0 commit comments