private void FindNextTask_NeedsLock(out Task targetTask, out QueuedTaskScheduler.QueuedTaskSchedulerQueue queueForTargetTask) { targetTask = null; queueForTargetTask = null; foreach (KeyValuePair <int, QueuedTaskScheduler.QueueGroup> _queueGroup in this._queueGroups) { QueuedTaskScheduler.QueueGroup value = _queueGroup.Value; foreach (int num in value.CreateSearchOrder()) { queueForTargetTask = value[num]; Queue <Task> tasks = queueForTargetTask._workItems; if (tasks.Count <= 0) { continue; } targetTask = tasks.Dequeue(); if (queueForTargetTask._disposed && tasks.Count == 0) { this.RemoveQueue_NeedsLock(queueForTargetTask); } value.NextQueueIndex = (value.NextQueueIndex + 1) % _queueGroup.Value.Count; return; } } }
private void RemoveQueue_NeedsLock(QueuedTaskScheduler.QueuedTaskSchedulerQueue queue) { QueuedTaskScheduler.QueueGroup item = this._queueGroups[queue._priority]; int num = item.IndexOf(queue); if (item.NextQueueIndex >= num) { QueuedTaskScheduler.QueueGroup nextQueueIndex = item; nextQueueIndex.NextQueueIndex = nextQueueIndex.NextQueueIndex - 1; } item.RemoveAt(num); }
public TaskScheduler ActivateNewQueue(int priority) { QueuedTaskScheduler.QueueGroup queueGroup; QueuedTaskScheduler.QueuedTaskSchedulerQueue queuedTaskSchedulerQueue = new QueuedTaskScheduler.QueuedTaskSchedulerQueue(priority, this); lock (this._queueGroups) { if (!this._queueGroups.TryGetValue(priority, out queueGroup)) { queueGroup = new QueuedTaskScheduler.QueueGroup(); this._queueGroups.Add(priority, queueGroup); } queueGroup.Add(queuedTaskSchedulerQueue); } return(queuedTaskSchedulerQueue); }