Esempio n. 1
0
        private async Task <IdGeneratorState> GetLockedStateAsync(string dataType, CancellationToken cancellationToken)
        {
            var tryTimeStart = DateTime.UtcNow;

            do
            {
                var idGeneratorState = await idGeneratorStateRepository.GetForDataTypeAsync(dataType) ?? new IdGeneratorState(dataType, 0);

                if (idGeneratorState.IsLocked && DateTime.UtcNow - idGeneratorState.LockTime > IdGeneratorState.MaxLockTime)
                {
                    await ReleaseLockAsync(idGeneratorState);
                }
                if (!idGeneratorState.IsLocked)
                {
                    idGeneratorState.Lock();
                    if (await idGeneratorStateRepository.TryGetLockAsync(idGeneratorState))
                    {
                        return(idGeneratorState);
                    }
                }
                await Task.Delay(TryPeriod, cancellationToken);

                cancellationToken.ThrowIfCancellationRequested();
            } while (DateTime.UtcNow - tryTimeStart < MaxTryTime);

            return(null);
        }