//private static object _getterLock = new object(); private DispatchQueue GetDispatchQueue(BlockingPriorityQueue <DispatchQueue> blockerQueue) { DispatchQueue queue = blockerQueue.Peek(); if (queue == null || blockerQueue.Count() < MAX_QUEUE_SIZE || (blockerQueue.Count() >= MAX_QUEUE_SIZE && queue.Size() >= MAX_QUEUE_TOLERANCE)) { queue = new DispatchQueue("Concurrent Queue " + blockerQueue.Count(), PriorityForQueue(blockerQueue)); } else { queue = blockerQueue.Dequeue(); } Console.WriteLine("Queue has " + queue.Size() + " jobs"); Console.WriteLine(blockerQueue.Count() + " Queues"); blockerQueue.enqueue(queue); lock (_monitorLock) { Monitor.Pulse(_monitorLock); } return(queue); }
private void CheckPriorityQueue(BlockingPriorityQueue <DispatchQueue> queue) { while (queue.Count() > MAX_QUEUE_SIZE) { DispatchQueue dQueue = queue.Dequeue(); if (dQueue == null) { return; } if (dQueue.State == DispatchQueue.QueueState.Idle || dQueue.State == DispatchQueue.QueueState.Disposed) { dQueue.Dispose(); Console.WriteLine("Removing queue"); } else { break; } } }
private void QueueMonitor() { bool check; while (true) { check = false; if (_defaultQueues.Count() > MAX_QUEUE_SIZE) { check = true; CheckPriorityQueue(_defaultQueues); } if (_highQueues.Count() > MAX_QUEUE_SIZE) { check = true; CheckPriorityQueue(_highQueues); } if (_lowQueues.Count() > MAX_QUEUE_SIZE) { check = true; CheckPriorityQueue(_lowQueues); } if (_backgroundQueues.Count() > MAX_QUEUE_SIZE) { check = true; CheckPriorityQueue(_backgroundQueues); } if (!check) { lock (_monitorLock) { Monitor.Wait(_monitorLock); } } else { Thread.Sleep(500); } } }