/// <summary> /// Shuts down the whole job executor </summary> public virtual void Shutdown() { lock (syncRoot) { if (!isActive) { return; } logger.LogInformation($"Shutting down the default async job executor [{this.GetType().FullName}]."); if (timerJobRunnable != null) { timerJobRunnable.Stop(); } if (asyncJobsDueRunnable != null) { asyncJobsDueRunnable.Stop(); } if (resetExpiredJobsRunnable != null) { resetExpiredJobsRunnable.Stop(); } StopResetExpiredJobsThread(); StopTimerAcquisitionThread(); StopJobAcquisitionThread(); StopExecutingAsyncJobs(); timerJobRunnable = null; asyncJobsDueRunnable = null; resetExpiredJobsRunnable = null; isActive = false; } }