Пример #1
0
 public AccumulateTasksSchedulerDecorator(ITaskScheduler innerScheduler, Action <Task> newTaskQueuedAction)
 {
     m_innerScheduler      = innerScheduler ?? throw new ArgumentNullException(nameof(innerScheduler));
     m_newTaskQueuedAction = newTaskQueuedAction;
     m_tasks = new ConcurrentQueue <Task>();
     m_queueToInnerSchedulerSwitch = new ThreadSafeSwitch();
     m_ignoreCancellationToken     = new ThreadLocal <bool>(() => false);
 }
            private void taskAdded(ThreadSafeSwitch taskSwitch)
            {
                if (m_stopCts.IsCancellationRequested)
                {
                    throw new InvalidOperationException("Could not add task - dispose is in progress");
                }

                taskSwitch.TrySet();
                isTaskLoopRequired();
            }
Пример #3
0
        public StrandSchedulerDecorator(ITaskScheduler originalScheduler)
        {
            m_originalScheduler = originalScheduler ?? throw new ArgumentNullException(nameof(originalScheduler));

            m_tasks = new ConcurrentQueue <Task>();
            m_canExecuteTaskSwitch    = new ThreadSafeSwitch();
            m_postOnCallStack         = new ThreadLocal <bool>(() => false);
            m_delayedTaskDequeueCts   = new CancellationTokenSource();
            m_alreadyQueuedTasksTable = new ConditionalWeakTable <Task, ThreadSafeSwitch>();
        }
            private void init(TaskScheduler controlScheduler, int maxTasksConcurrency)
            {
                if (maxTasksConcurrency <= 0)
                {
                    throw new ArgumentOutOfRangeException(nameof(maxTasksConcurrency));
                }

                m_maxConcurrentTaskBatch = Math.Min(CONCURRENT_TASK_BATCH_LIMIT, maxTasksConcurrency);

                m_exclusiveTaskAdded  = new ThreadSafeSwitch();
                m_concurrentTaskAdded = new ThreadSafeSwitch();

                m_ownControlTaskScheduler = (controlScheduler == null);
                if (m_ownControlTaskScheduler)
                {
                    var ioControlService = new IoServiceScheduler();
                    m_ioControlScheduler = new IoServiceThreadPoolScheduler(ioControlService, CONTROL_SCHEDULER_CONCURRENCY);
                    var controlProxyScheduler = new ProxyScheduler(m_ioControlScheduler);
                    m_controlTaskFactory = new TaskFactory(controlProxyScheduler.AsTplScheduler());
                }
                else
                {
                    m_controlTaskFactory = new TaskFactory(controlScheduler);
                }


                var ioService = new IoServiceScheduler();

                m_threadPoolScheduler           = new IoServiceThreadPoolScheduler(ioService, maxTasksConcurrency);
                m_concurrentAccumulateScheduler = new AccumulateTasksSchedulerDecorator(m_threadPoolScheduler, _ => taskAdded(m_concurrentTaskAdded));
                var strandScheduler           = new StrandSchedulerDecorator(m_threadPoolScheduler);
                var innerStrandProxyScheduler = new ProxyScheduler(strandScheduler);

                m_strandAccumulateScheduler = new AccumulateTasksSchedulerDecorator(strandScheduler, _ => taskAdded(m_exclusiveTaskAdded));
                m_strandProxyScheduler      = new ProxyScheduler(m_strandAccumulateScheduler);
                m_concurrentProxyScheduler  = new ProxyScheduler(m_concurrentAccumulateScheduler);
                m_processTaskLoop           = null;
                m_completedTcs = new TaskCompletionSource <Object>();
                m_stopCts      = new CancellationTokenSource();
                m_isDisposed   = false;
            }