Beispiel #1
0
        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));
                }
            }
        }