private static IWorkItemWaiterEntry CreateNotSignalableWorkItemWaiterEntry()
        {
            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>();

            workItemWaiterEntry.TrySignal(null).ReturnsForAnyArgs(false);
            return(workItemWaiterEntry);
        }
        public void EnqueueShouldNotAddWorkItemToQueueWhenWaiterIsSignaled()
        {
            IWorkItem workItem = Substitute.For <IWorkItem>();

            IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>();

            workItemWaiterEntry.TrySignal(workItem).Returns(true);

            IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>();

            workItemWaiterEntryStack.Count.Returns(1);
            workItemWaiterEntryStack.Pop().Returns(workItemWaiterEntry);

            WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack);

            workItemQueue.Enqueue(workItem);

            Assert.AreEqual(0, workItemQueue.Count);
        }
Пример #3
0
        /// <summary>
        /// Ýþ parçasýný kuyruða atar.
        /// </summary>
        /// <param name="workItem">Ýþ parçasý.</param>
        public void Enqueue(IWorkItem workItem)
        {
            if (workItem == null)
            {
                throw new ArgumentNullException("workItem");
            }

            lock (this)
            {
                if (m_IsShutDown)
                {
                    throw new LaboThreadingException("Ýþ parçasý kuyruðu iþ parçasý eklemeye kapatýlmýþtýr. Yeni iþ parçasý ekleyemezsiniz.");
                }

                bool enqueue = true;

                // Eðer bekleyen Thread varsa iþ parçasýný ona yollayacaðýz.
                while (m_WorkItemWaiterEntryStack.Count > 0)
                {
                    // Dequeue a waiter.
                    IWorkItemWaiterEntry waiterEntry = m_WorkItemWaiterEntryStack.Pop();

                    // Eðer zaman aþýmý yoksa iþ parçasý bekleyen Thread'e iþlenmesi için yolluyoruz ve kuyruða eklememize gerek kalmýyor.
                    if (waiterEntry.TrySignal(workItem))
                    {
                        workItem.State = WorkItemState.Scheduled;

                        enqueue = false;
                        break;
                    }
                }

                // Hiç bekleyen Thread yoksa iþ parçasýný kuyruða ekliyoruz.
                if (enqueue)
                {
                    workItem.State = WorkItemState.Queued;

                    // Enqueue the work item
                    m_WorkItemsQueue.Enqueue(workItem);
                }
            }
        }