/// <summary> /// Main processing loop for internal thread. /// </summary> private void MainLoop() { while (!ShouldExit) { //if: //1) Single worker is allowed when idle //2) This worker is idle //3) All other workers are idle // Then: pause all other workers, and switch to single worker mode if (_workerCollection.Configuration.SingleWorkerWhenNoWorkFound && IdleStatus == WorkerIdleStatus.Idle && _workerCollection.AllWorkersAreIdle) { _workerCollection.PauseWorkers(); } if (ShouldExit) { return; } MessageProcessing.Handle(); } if (MessageProcessing != null && MessageProcessing.AsyncTaskCount > 0) { WaitOnAsyncTask.Wait(() => MessageProcessing.AsyncTaskCount > 0, () => _log.LogWarning( $"Unable to terminate because async requests have not finished. Current task count is {MessageProcessing.AsyncTaskCount}")); } }
/// <summary> /// Looks for messages to process /// </summary> private void MainLoop() { while (!ShouldExit) { //wait, if told to do so _pauseEvent.Wait(); if (ShouldExit) { return; } MessageProcessing.Handle(); } if (MessageProcessing != null && MessageProcessing.AsyncTaskCount > 0) { WaitOnAsyncTask.Wait(() => MessageProcessing.AsyncTaskCount > 0, () => _log.Warn( $"Unable to terminate because async requests have not finished. Current task count is {MessageProcessing.AsyncTaskCount}")); } }