private async Task Run(CancellationToken token) { while (true) { token.ThrowIfCancellationRequested(); TimeSpan timeToSleep = jobStoreSupport.ClusterCheckinInterval; TimeSpan transpiredTime = SystemTime.UtcNow() - jobStoreSupport.LastCheckin; timeToSleep = timeToSleep - transpiredTime; if (timeToSleep <= TimeSpan.Zero) { timeToSleep = TimeSpan.FromMilliseconds(100); } if (numFails > 0) { timeToSleep = jobStoreSupport.DbRetryInterval > timeToSleep ? jobStoreSupport.DbRetryInterval : timeToSleep; } await Task.Delay(timeToSleep, token).ConfigureAwait(false); token.ThrowIfCancellationRequested(); if (await Manage().ConfigureAwait(false)) { jobStoreSupport.SignalSchedulingChangeImmediately(SchedulerConstants.SchedulingSignalDateTime); } } // ReSharper disable once FunctionNeverReturns }
private async Task Run() { var token = cancellationTokenSource.Token; while (!token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); DateTimeOffset sTime = SystemTime.UtcNow(); RecoverMisfiredJobsResult recoverMisfiredJobsResult = await Manage().ConfigureAwait(false); if (recoverMisfiredJobsResult.ProcessedMisfiredTriggerCount > 0) { jobStoreSupport.SignalSchedulingChangeImmediately(recoverMisfiredJobsResult.EarliestNewTime); } token.ThrowIfCancellationRequested(); TimeSpan timeToSleep = TimeSpan.FromMilliseconds(50); // At least a short pause to help balance threads if (!recoverMisfiredJobsResult.HasMoreMisfiredTriggers) { timeToSleep = jobStoreSupport.MisfireThreshold - (SystemTime.UtcNow() - sTime); if (timeToSleep <= TimeSpan.Zero) { timeToSleep = TimeSpan.FromMilliseconds(50); } if (numFails > 0) { timeToSleep = jobStoreSupport.DbRetryInterval > timeToSleep ? jobStoreSupport.DbRetryInterval : timeToSleep; } } await Task.Delay(timeToSleep, token).ConfigureAwait(false); } }