private bool existsTasksToProcess(QueueTasksResult exclusiveQueueResult, QueueTasksResult concurrentQueueResult)
 {
     return(m_exclusiveTaskAdded.IsSet ||
            m_concurrentTaskAdded.IsSet ||
            exclusiveQueueResult.HasMoreTasks ||
            concurrentQueueResult.HasMoreTasks);
 }
            private void runInnerTaskLoop()
            {
                QueueTasksResult exclusiveQueueResult  = null;
                QueueTasksResult concurrentQueueResult = null;

                do
                {
                    do
                    {
                        m_exclusiveTaskAdded.TryReset();
                        m_exclusiveQueueTasksParams = m_exclusiveQueueTasksParams ?? new QueueTasksParams(maxNumberOfQueuedTasks: MAX_STRAND_TASK_BATCH);
                        exclusiveQueueResult        = m_strandAccumulateScheduler.QueueTasksToInnerScheduler(m_exclusiveQueueTasksParams);
                        exclusiveQueueResult.WhenAllTask.Wait();
                    } while (m_exclusiveTaskAdded.IsSet || exclusiveQueueResult.HasMoreTasks);

                    do
                    {
                        m_concurrentTaskAdded.TryReset();
                        m_concurrentQueueTaskParams = m_concurrentQueueTaskParams ?? new QueueTasksParams(maxNumberOfQueuedTasks: m_maxConcurrentTaskBatch);
                        concurrentQueueResult       = m_concurrentAccumulateScheduler.QueueTasksToInnerScheduler(m_concurrentQueueTaskParams);
                        concurrentQueueResult.WhenAllTask.Wait();
                    } while (!m_exclusiveTaskAdded.IsSet && (m_concurrentTaskAdded.IsSet || concurrentQueueResult.HasMoreTasks));
                } while (existsTasksToProcess(exclusiveQueueResult, concurrentQueueResult));

                var resetTaskResult = tryResetLoopTask();

                Debug.Assert(resetTaskResult);
                isTaskLoopRequired();
            }
Ejemplo n.º 3
0
        public virtual QueueTasksResult QueueTasksToInnerScheduler(QueueTasksParams queueTasksParams = null)
        {
            CheckIfDisposed();

            var currentParams = queueTasksParams ?? new QueueTasksParams();
            var currentTasks  = new List <Task>();

            var hasMoreTasks = false;

            try
            {
                if (processingCanceled())
                {
                    return(new QueueTasksResult(numberOfQueuedTasks: 0,
                                                whenAllTask: PredefinedTasks.CompletedTask,
                                                hasMoreTasks: false));
                }

                if (!m_queueToInnerSchedulerSwitch.TrySet())
                {
                    return(new QueueTasksResult(numberOfQueuedTasks: 0,
                                                whenAllTask: PredefinedTasks.CompletedTask,
                                                hasMoreTasks: !m_tasks.IsEmpty));
                }

                queueTasks(currentParams, currentTasks);

                hasMoreTasks = !m_tasks.IsEmpty;
            }
            finally
            {
                m_queueToInnerSchedulerSwitch.TryReset();
            }

            var whenAllTask = Task.WhenAll(currentTasks);
            var result      = new QueueTasksResult(numberOfQueuedTasks: currentTasks.Count,
                                                   whenAllTask: whenAllTask,
                                                   hasMoreTasks: hasMoreTasks);

            return(result);
        }