@@ -61,6 +61,7 @@ public sealed class BlockchainProcessor : IBlockchainProcessor, IBlockProcessing
61
61
62
62
private bool _recoveryComplete = false ;
63
63
private int _queueCount ;
64
+ private bool _disposed ;
64
65
65
66
private readonly ProcessingStats _stats ;
66
67
@@ -101,9 +102,6 @@ public BlockchainProcessor(
101
102
_stateReader = stateReader ?? throw new ArgumentNullException ( nameof ( stateReader ) ) ;
102
103
_options = options ;
103
104
104
- _blockTree . NewBestSuggestedBlock += OnNewBestBlock ;
105
- _blockTree . NewHeadBlock += OnNewHeadBlock ;
106
-
107
105
_stats = new ProcessingStats ( stateReader , _logger ) ;
108
106
_loopCancellationSource = new CancellationTokenSource ( ) ;
109
107
}
@@ -179,13 +177,34 @@ public async ValueTask Enqueue(Block block, ProcessingOptions processingOptions)
179
177
180
178
public void Start ( )
181
179
{
180
+ ObjectDisposedException . ThrowIf ( _disposed , this ) ;
181
+ if ( _processorTask is not null ) ThrowAlreadyStarted ( ) ;
182
+
183
+ _blockTree . NewBestSuggestedBlock += OnNewBestBlock ;
184
+ _blockTree . NewHeadBlock += OnNewHeadBlock ;
185
+
182
186
_loopCancellationSource ??= new CancellationTokenSource ( ) ;
183
187
_recoveryTask = RunRecovery ( ) ;
184
188
_processorTask = RunProcessing ( ) ;
189
+
190
+ if ( _logger . IsInfo ) _logger . Info ( $ "{ nameof ( BlockchainProcessor ) } started.") ;
191
+
192
+ [ StackTraceHidden , DoesNotReturn ]
193
+ static void ThrowAlreadyStarted ( ) => throw new InvalidOperationException ( $ "{ nameof ( BlockchainProcessor ) } already started") ;
185
194
}
186
195
187
196
public async Task StopAsync ( bool processRemainingBlocks = false )
188
197
{
198
+ if ( _disposed ) return ;
199
+ _disposed = true ;
200
+
201
+ bool isStarted = _processorTask is not null ;
202
+ if ( isStarted )
203
+ {
204
+ _blockTree . NewBestSuggestedBlock -= OnNewBestBlock ;
205
+ _blockTree . NewHeadBlock -= OnNewHeadBlock ;
206
+ }
207
+
189
208
_recoveryComplete = true ;
190
209
if ( processRemainingBlocks )
191
210
{
@@ -201,7 +220,7 @@ public async Task StopAsync(bool processRemainingBlocks = false)
201
220
}
202
221
203
222
await Task . WhenAll ( _recoveryTask ?? Task . CompletedTask , _processorTask ?? Task . CompletedTask ) ;
204
- if ( _logger . IsInfo ) _logger . Info ( "Blockchain Processor shutdown complete.. please wait for all components to close ") ;
223
+ if ( isStarted && _logger . IsInfo ) _logger . Info ( $ " { nameof ( BlockchainProcessor ) } shutdown complete.") ;
205
224
}
206
225
207
226
private async Task RunRecovery ( )
@@ -800,8 +819,6 @@ void ThrowUnknownUncleHash(Block suggestedBlock, int i)
800
819
801
820
public async ValueTask DisposeAsync ( )
802
821
{
803
- _blockTree . NewBestSuggestedBlock -= OnNewBestBlock ;
804
- _blockTree . NewHeadBlock -= OnNewHeadBlock ;
805
822
await StopAsync ( processRemainingBlocks : false ) ;
806
823
}
807
824
0 commit comments