public void EnqueueTrySignalMethodShouldBeCalledWhenWaitingStackIsNotEmpty() { IWorkItemWaiterEntry workItemWaiterEntry = Substitute.For <IWorkItemWaiterEntry>(); IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>(); int count = 1; workItemWaiterEntryStack.Count.Returns(x => count); workItemWaiterEntryStack.Pop().Returns( x => { if (count == 1) { count = 0; return(workItemWaiterEntry); } return(null); }); WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack); IWorkItem workItem = Substitute.For <IWorkItem>(); workItemQueue.Enqueue(workItem); workItemWaiterEntry.Received(1).TrySignal(workItem); }
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); }
/// <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); } } }
public void EnqueueShouldAddWorkItemToQueueWhenAllWaitersTimedOut() { Stack <IWorkItemWaiterEntry> workItemWaiterEntries = new Stack <IWorkItemWaiterEntry>(); workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry()); workItemWaiterEntries.Push(CreateNotSignalableWorkItemWaiterEntry()); IWorkItemWaiterEntryStack workItemWaiterEntryStack = Substitute.For <IWorkItemWaiterEntryStack>(); workItemWaiterEntryStack.Count.Returns(x => workItemWaiterEntries.Count); workItemWaiterEntryStack.Pop().Returns(x => workItemWaiterEntries.Pop()); WorkItemQueue workItemQueue = new WorkItemQueue(1 * 1000, workItemWaiterEntryStack); IWorkItem workItem = Substitute.For <IWorkItem>(); workItemQueue.Enqueue(workItem); Assert.AreEqual(1, workItemQueue.Count); }