@@ -16,7 +16,8 @@ public class DefaultEventQueue : IEventQueue {
16
16
private readonly IObjectStorage _storage ;
17
17
private readonly IJsonSerializer _serializer ;
18
18
private Timer _queueTimer ;
19
- private bool _processingQueue ;
19
+ private Task _processingQueueTask ;
20
+ private readonly object _sync = new object ( ) ;
20
21
private readonly TimeSpan _processQueueInterval = TimeSpan . FromSeconds ( 10 ) ;
21
22
private DateTime ? _suspendProcessingUntil ;
22
23
private DateTime ? _discardQueuedItemsUntil ;
@@ -45,20 +46,26 @@ public void Enqueue(Event ev) {
45
46
}
46
47
47
48
public Task ProcessAsync ( ) {
48
- return Task . Factory . StartNew ( Process ) ;
49
+ return Task . Run ( Process ) ;
49
50
}
50
51
51
- public void Process ( ) {
52
+ public Task Process ( ) {
52
53
if ( ! _config . Enabled ) {
53
54
_log . Info ( typeof ( DefaultEventQueue ) , "Configuration is disabled. The queue will not be processed." ) ;
54
- return ;
55
+ return Task . FromResult ( false ) ;
55
56
}
56
57
57
- if ( _processingQueue )
58
- return ;
58
+ TaskCompletionSource < bool > tcs ;
59
+ lock ( _sync ) {
60
+ if ( _processingQueueTask != null ) {
61
+ return _processingQueueTask ;
62
+ } else {
63
+ tcs = new TaskCompletionSource < bool > ( ) ;
64
+ _processingQueueTask = tcs . Task ;
65
+ }
66
+ }
59
67
60
- _processingQueue = true ;
61
-
68
+ Task resultTask ;
62
69
try {
63
70
_log . Trace ( typeof ( DefaultEventQueue ) , "Processing queue..." ) ;
64
71
_storage . CleanupQueueFiles ( _config . GetQueueName ( ) , _config . QueueMaxAge , _config . QueueMaxAttempts ) ;
@@ -131,16 +138,20 @@ public void Process() {
131
138
_log . Error ( typeof ( DefaultEventQueue ) , ex , String . Concat ( "An error occurred while processing the queue: " , ex . Message ) ) ;
132
139
SuspendProcessing ( ) ;
133
140
} finally {
134
- _processingQueue = false ;
141
+ tcs . SetResult ( true ) ;
142
+ lock ( _sync ) {
143
+ _processingQueueTask = null ;
144
+ resultTask = tcs . Task ;
145
+ }
135
146
}
147
+ return resultTask ;
136
148
}
137
149
138
150
private void OnProcessQueue ( object state ) {
139
151
if ( IsQueueProcessingSuspended )
140
152
return ;
141
-
142
- if ( ! _processingQueue )
143
- Process ( ) ;
153
+
154
+ Process ( ) ;
144
155
}
145
156
146
157
public void SuspendProcessing ( TimeSpan ? duration = null , bool discardFutureQueuedItems = false , bool clearQueue = false ) {
0 commit comments