private async Task SaveInterval(TimeSpan?waitTime = null, TimeSpan?workTime = null, string key = null, CancellationToken cancellationToken = default)
        {
            using IDisposable lockAsync = await _distributedLock.CreateLockAsync(key ?? _key, TimeSpan.FromMinutes(5), waitTime ?? TimeSpan.FromMinutes(5),
                                                                                 TimeSpan.FromMilliseconds(100), cancellationToken);

            var start = _stopwatch.ElapsedTicks;
            await Task.Delay(workTime ?? TimeSpan.Zero, cancellationToken);

            var end      = _stopwatch.ElapsedTicks;
            var interval = new Interval(start, end);

            lock (_intervalsLock)
            {
                Intervals.Add(interval);
            }
        }
Exemplo n.º 2
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                using (await _distributedLock.CreateLockAsync("test-lock", waitTime: TimeSpan.FromMinutes(5), retryTime: TimeSpan.FromMilliseconds(10),
                                                              cancellationToken: stoppingToken))
                {
                    _logger.LogInformation("App:{appId} | Instance: {instanceId} | Worker running at: {time}", Program.AppId, _instanceId, DateTimeOffset.Now);
                    await Task.Delay(TimeSpan.FromSeconds(3), stoppingToken);

                    _logger.LogInformation("App:{appId} | Instance: {instanceId} | Worker finished at: {time}", Program.AppId, _instanceId, DateTimeOffset.Now);
                }

                // RedLock uses retries and will use mostly only one instance of the worker
                await Task.Delay(_random.Next(100, 200), stoppingToken);
            }
        }