Пример #1
0
 public AsyncQueueRequest(string ownerId, Guid organizationalUnitRoot, AsyncQueuePriority priority) : this()
 {
     this.OwnerId = ownerId;
     this.OrganizationalUnitRoot = organizationalUnitRoot;
     this.Priority      = priority;
     this.RequestStatus = AsyncQueueStatus.NotStarted;
 }
Пример #2
0
        public void TestPriorityQueue()
        {
            using (Reference <ILogger> loggerRef = Reference <ILogger> .Create(new TraceLogger(true)))
            {
                const int iterations = 100000;
                int       sendCount  = 0;
                int       recvCount  = 0;
                int       excpCount  = 0;

                // dispatches a series of tasks with various priorities
                int   nPriorities = Enum.GetValues(typeof(AsyncQueuePriority)).Length;
                int[] _LastRecv   = new int[nPriorities];
                for (int l = 0; l < nPriorities; l++)
                {
                    _LastRecv[l] = -1;
                }
                using (AsyncPriorityQueue queue = new AsyncPriorityQueue(loggerRef.Target))
                {
                    AsyncQueueCallback <int> callback = delegate(int value)
                    {
                        int count = Interlocked.Increment(ref recvCount);
                        // check values are recevied in priority order
                        int i        = value % 1000000;
                        int priority = (value - i) / 1000000;
                        int last     = _LastRecv[priority];
                        if (i <= last)
                        {
                            int errors = Interlocked.Increment(ref excpCount);
                            if (errors <= 50)
                            {
                                loggerRef.Target.LogDebug("Priority={0}: i ({1}) not greater than previous ({2})!",
                                                          priority, i, last);
                            }
                        }
                        _LastRecv[priority] = i;
                    };
                    for (int i = 0; i < iterations; i++)
                    {
                        Interlocked.Increment(ref sendCount);
                        AsyncQueuePriority priority = (AsyncQueuePriority)(i % nPriorities);
                        int value = (int)priority * 1000000 + i;
                        queue.Dispatch <int>(value, callback, priority);
                    }
                    Assert.AreEqual <int>(iterations, sendCount);
                    long itemsRemaining = queue.WaitUntilEmpty(TimeSpan.FromSeconds(30));
                    Assert.AreEqual <long>(0, itemsRemaining);
                    Assert.AreEqual <int>(iterations, recvCount);
                    Assert.AreEqual <int>(0, excpCount);
                }
            }
        }
Пример #3
0
        protected void EnqueueData <T>(T data, AsyncQueueCallback <T> callback, AsyncQueuePriority priority, string itemKey)
        {
            if (_Closed)
            {
                return; // throw new InvalidOperationException("Cannot enqueue while closing!");
            }
            AsyncQueueItemUser <T> item = new AsyncQueueItemUser <T>(callback, data);

            AcquireLock();
            try
            {
                this.OnEnqueueItem(item, priority, itemKey);
            }
            finally
            {
                ReleaseLock();
            }

            // dispatch a dequeue thread if needed
            Interlocked.Increment(ref _EnqueueThreads);
            ThreadPool.QueueUserWorkItem(DequeueItems);
        }
Пример #4
0
 protected override void OnEnqueueItem(AsyncQueueItemBase item, AsyncQueuePriority priority, string itemKey)
 {
     _queue.Enqueue(item);
 }
Пример #5
0
 public void Dispatch <T>(T data, AsyncQueueCallback <T> callback, AsyncQueuePriority priority)
 {
     EnqueueData(data, callback, priority, null);
 }
Пример #6
0
 protected override void OnEnqueueItem(AsyncQueueItemBase item, AsyncQueuePriority priority, string itemKey)
 {
     _priorityStack[(int)priority][itemKey] = item;
 }
Пример #7
0
 public void Dispatch <T>(T data, AsyncQueueCallback <T> callback, AsyncQueuePriority priority, string itemKey)
 {
     EnqueueData <T>(data, callback, priority, itemKey);
 }
Пример #8
0
 protected virtual void OnEnqueueItem(AsyncQueueItemBase item, AsyncQueuePriority priority, string itemKey)
 {
     throw new NotImplementedException();
 }