protected virtual async Task LoadConsumer() { int idleCount = 0; await Task.Delay(1000); while (_ConsumerStatus != ConsumerStatus.DISPOSE) { try { while (_ConsumerStatus == ConsumerStatus.OFFLINE) { await Task.Delay(1000); } ; var objects = GetObjectsFromQueue(MaxMemoryQueueObjects - MemoryQueue.Count); if (objects.NullOrEmpty()) { idleCount++; if (_ConsumerStatus == ConsumerStatus.ONLINE_IDLE) { var waitingTime = idleCount * SCHEDULE_BASE_IDLE_TIME; if (waitingTime >= SCHEDULE_MAX_IDLE_TIME) { waitingTime = SCHEDULE_BASE_IDLE_TIME; } await Task.Delay(waitingTime); } else { if (_ConsumerStatus == ConsumerStatus.ONLINE && idleCount >= 25) { _ConsumerStatus = ConsumerStatus.ONLINE_IDLE; } } } else { idleCount = 0; _ConsumerStatus = ConsumerStatus.ONLINE; MemoryQueue.EnqueueRange(objects); } } catch (Exception ex) { Log.Error($"Consumer from ThreadGroup '{this.ThreadGroup}' and ThreadGuid:'{this.ThreadGuid} could not get objects from queue.", exception: ex); _ConsumerStatus = ConsumerStatus.ONLINE_IDLE; } } }