public static void Execute() { LogManager.Log("Workers will run every " + WorkerSleepTimer + " milliseconds. Activating " + NumberofThreads + " threads"); //set number of threads options.MaxDegreeOfParallelism = NumberofThreads; try { CachingAvailability.ResetTrackerTable(); } catch (Exception ex) { LogManager.LogException(ex, "Error on ResetTrackerTable.", LogLevel.Error); } WorkerPropertyTimer.Elapsed += OnTimedEvent_StartPropertyWorkers; WorkerPropertyTimer.Interval = WorkerSleepTimer; WorkerPropertyTimer.Start(); }
private static void OnTimedEvent_StartPropertyWorkers(object source, ElapsedEventArgs e) { try { LogManager.Log("Attempting to acquire lock.", LogLevel.Debug); lock (PropertyLock) { if (_isPropertyWorkerRunning) { return; } else { _isPropertyWorkerRunning = true; } } var propertiesToRefresh = new List <CacheAvailabilityTracker>(); for (int i = 0; i < NumberofThreads; i++) { var tracker = CachingAvailability.GetPropertyToRefresh(); tracker.AssignedWorker = "Property Worker: " + i; propertiesToRefresh.Add(tracker); } Parallel.ForEach(propertiesToRefresh, options, Logical.PropertyWorker); lock (PropertyLock) { _isPropertyWorkerRunning = false; } } catch (Exception ex) { LogManager.LogException("Timer tick failed", ex, LogLevel.Error); lock (PropertyLock) { _isPropertyWorkerRunning = false; } } }