Esempio n. 1
0
        /**************************************************************************/

        public Queue <T> AddToNamedQueue(string Name, T Item)
        {
            Queue <T> NamedQueue;
            Boolean   Proceed = true;

            if (this.NamedQueues.ContainsKey(Name))
            {
                NamedQueue = this.NamedQueues[Name];
            }
            else
            {
                throw(new MacroscopeNamedQueueException(string.Format("Named queue \"{0}\" does not exist", Name)));
            }

            if (this.NamedQueuesMode[Name] == MacroscopeNamedQueue <T> .MODE.USE_HISTORY)
            {
                lock (this.NamedQueuesHistory[Name])
                {
                    // TODO: This does not work with reference values
                    if (this.NamedQueuesHistory[Name].ContainsKey(Item.ToString()))
                    {
                        Proceed = false;
                        throw(new MacroscopeNamedQueueException(string.Format("Item already seen in queue \"{0}\"", Name)));
                    }
                    else
                    {
                        this.NamedQueuesHistory[Name].Add(Item.ToString(), true);
                    }
                }
            }

            if (Proceed)
            {
                lock (this.NamedQueues[Name])
                {
                    if (!NamedQueue.Contains(Item))
                    {
                        if (!this.NamedQueuesIndex[Name].ContainsKey(Item))
                        {
                            lock (this.NamedQueuesIndex[Name])
                            {
                                this.NamedQueuesIndex[Name].Add(Item, true);
                                NamedQueue.Enqueue(Item);
                            }
                        }
                    }
                }
            }

            return(NamedQueue);
        }
        public void Enqueue(T message, string queueName)
        {
            _lock.AcquireWriterLock(500);

            var namedQueue = _queues.FirstOrDefault(nq => nq.Name == queueName);

            if (namedQueue == null)
            {
                namedQueue = new NamedQueue {
                    Name = queueName, Queue = new Queue <T>()
                };
                _queues.Add(namedQueue);
            }
            namedQueue.Queue.Enqueue(message);
            if (Queue_not_blocked(namedQueue))
            {
                _signal.Set();
            }

            _lock.ReleaseWriterLock();
        }
        public bool TryDequeue(string workerId, out T message)
        {
            _lock.AcquireWriterLock(500);
            try
            {
                message = default(T);

                Free_queue_locked_for_worker(workerId);

                NamedQueue namedQueue = null;
                for (var i = 0; i < _queues.Count(); i++)
                {
                    namedQueue = Get_next_queue();
                    if (Queue_ready_for_dequeue(namedQueue))
                    {
                        break;
                    }
                    namedQueue = null;
                }
                if (namedQueue == null)
                {
                    _signal.Reset();
                    return(false);
                }

                message = namedQueue.Queue.Dequeue();
                Lock_queue_for_worker(workerId, namedQueue);

                _signal.Reset();
                return(true);
            }
            finally
            {
                _lock.ReleaseWriterLock();
            }
        }
 private bool Queue_ready_for_dequeue(NamedQueue namedQueue)
 {
     return(Queue_not_blocked(namedQueue) && namedQueue.Queue.Any());
 }
 private void Lock_queue_for_worker(string workerId, NamedQueue namedQueue)
 {
     _readLocks[namedQueue.Name] = workerId;
 }
 private bool Queue_not_blocked(NamedQueue namedQueue)
 {
     return(!_readLocks.ContainsKey(namedQueue.Name));
 }