private void CoreLoop() { CleanUp(); for (; ;) { while (_completeQueue.TryDequeue(out var identifier)) { _runningTasks.RemoveAll(task => task.Identifier.Equals(identifier)); _provider.MarkAsCompleted(identifier); } var state = _provider.TryGetNextAvailableTask(out var newId); switch (state) { case TaskProviderState.Normal: var task = CreateInternalTask(newId); _provider.MarkAsRunning(newId); _runningTasks.Add(task); task.ClrTask.Start(); break; case TaskProviderState.NoAvailableTask: if (!HasRunningTask) { // No running task but nothing to run. Likely the computation is aborted. return; } WaitAnyInternalTask(); break; case TaskProviderState.AllComplete: case TaskProviderState.Abort: WaitAllInternalTasks(); return; default: throw new ArgumentOutOfRangeException(nameof(state)); } } }