9
9
10
10
namespace WorkflowCore . Services
11
11
{
12
- public class LifeCycleEventPublisher : ILifeCycleEventPublisher
12
+ public class LifeCycleEventPublisher : ILifeCycleEventPublisher , IDisposable
13
13
{
14
14
private readonly ILifeCycleEventHub _eventHub ;
15
15
private readonly ILogger _logger ;
16
- private readonly ConcurrentQueue < LifeCycleEvent > _outbox ;
16
+ private readonly BlockingCollection < LifeCycleEvent > _outbox ;
17
17
protected Task DispatchTask ;
18
- private CancellationTokenSource _cancellationTokenSource ;
19
18
20
19
public LifeCycleEventPublisher ( ILifeCycleEventHub eventHub , ILoggerFactory loggerFactory )
21
20
{
22
21
_eventHub = eventHub ;
23
- _outbox = new ConcurrentQueue < LifeCycleEvent > ( ) ;
22
+ _outbox = new BlockingCollection < LifeCycleEvent > ( ) ;
24
23
_logger = loggerFactory . CreateLogger ( GetType ( ) ) ;
25
24
}
26
25
27
26
public void PublishNotification ( LifeCycleEvent evt )
28
27
{
29
- _outbox . Enqueue ( evt ) ;
28
+ if ( _outbox . IsAddingCompleted )
29
+ return ;
30
+
31
+ _outbox . Add ( evt ) ;
30
32
}
31
33
32
34
public void Start ( )
@@ -36,45 +38,36 @@ public void Start()
36
38
throw new InvalidOperationException ( ) ;
37
39
}
38
40
39
- _cancellationTokenSource = new CancellationTokenSource ( ) ;
40
-
41
41
DispatchTask = new Task ( Execute ) ;
42
42
DispatchTask . Start ( ) ;
43
43
}
44
44
45
45
public void Stop ( )
46
46
{
47
- _cancellationTokenSource . Cancel ( ) ;
47
+ _outbox . CompleteAdding ( ) ;
48
+
48
49
DispatchTask . Wait ( ) ;
49
50
DispatchTask = null ;
50
51
}
51
52
53
+ public void Dispose ( )
54
+ {
55
+ _outbox . Dispose ( ) ;
56
+ }
57
+
52
58
private async void Execute ( )
53
59
{
54
- var cancelToken = _cancellationTokenSource . Token ;
55
-
56
- while ( ! cancelToken . IsCancellationRequested )
60
+ try
57
61
{
58
- try
62
+ foreach ( var evt in _outbox . GetConsumingEnumerable ( ) )
59
63
{
60
- if ( ! SpinWait . SpinUntil ( ( ) => _outbox . Count > 0 , 1000 ) )
61
- {
62
- continue ;
63
- }
64
-
65
- if ( _outbox . TryDequeue ( out LifeCycleEvent evt ) )
66
- {
67
- await _eventHub . PublishNotification ( evt ) ;
68
- }
69
- }
70
- catch ( OperationCanceledException )
71
- {
72
- }
73
- catch ( Exception ex )
74
- {
75
- _logger . LogError ( ex . Message ) ;
64
+ await _eventHub . PublishNotification ( evt ) ;
76
65
}
77
66
}
67
+ catch ( Exception ex )
68
+ {
69
+ _logger . LogError ( default ( EventId ) , ex , ex . Message ) ;
70
+ }
78
71
}
79
72
}
80
- }
73
+ }
0 commit comments