private void RecalculateProductionTimer() { _registryGroupState.Round = 0; if (_syncCycleDescriptor != null) { _syncCycleDescriptor.CancellationTokenSource.Cancel(); _syncCycleDescriptor.CancellationRequested = true; } _syncCycleDescriptor = new SyncCycleDescriptor(_synchronizationContext.LastBlockDescriptor); PeriodicTaskFactory.Start(o => { SyncCycleDescriptor syncCycleDescriptor = (SyncCycleDescriptor)o; SortedList <ushort, RegistryRegisterBlock> transactionStateWitnesses = _registryMemPool.DequeueStateWitnessBulk(); SortedList <ushort, RegistryRegisterUtxoConfidential> transactionUtxoWitnesses = _registryMemPool.DequeueUtxoWitnessBulk(); RegistryFullBlock registryFullBlock = ProduceTransactionsFullBlock(transactionStateWitnesses, transactionUtxoWitnesses, syncCycleDescriptor.SynchronizationDescriptor, syncCycleDescriptor.Round); RegistryShortBlock registryShortBlock = ProduceTransactionsShortBlock(registryFullBlock); SendTransactionsBlocks(registryFullBlock, registryShortBlock); syncCycleDescriptor.Round++; if (syncCycleDescriptor.CancellationRequested) { syncCycleDescriptor.CancellationTokenSource.Cancel(); } }, _syncCycleDescriptor, _registrationPeriodMsec * _registryConfiguration.TotalNodes, _registryConfiguration.Position * _registrationPeriodMsec, cancelToken: _syncCycleDescriptor.CancellationTokenSource.Token, periodicTaskCreationOptions: TaskCreationOptions.LongRunning); }