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); } }
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); } }