/// <summary> /// Creates delivery processors to handle orders, based on the number specified /// when the service was constructed /// </summary> private void CreateProcessors() { DeliveryProcessor newProcessor; for (int i = 1; i <= numDeliveryProcessors; i++) { newProcessor = new DeliveryProcessor(i); deliveryProcessors.Add(newProcessor); } }
public void CheckOrdersList(object data, EventArgs e) { Order currentOrder; lock (incompleteOrders) { // Find all orders that have been processed, and get the lowest order number // Must get a lock on the object before the min is calculated currentOrder = incompleteOrders.FirstOrDefault(o => o.currentStatus == Order.Status.Processed); } if (currentOrder != null) { currentOrder.currentStatus = Order.Status.Delivered; // Check whether there is an available payment processor. DeliveryProcessor availableProcessor = null; availableProcessor = deliveryProcessors.Find(p => p.isAvailable); if (availableProcessor != null) { // Once an available processor is found, then make sure it's unavailable or 'busy' for now availableProcessor.isAvailable = false; availableProcessor.ProcessDelivery(currentOrder).Wait(); // Allow the processor to become available again availableProcessor.isAvailable = true; // Delivery will always succeed, so remove the order from the queue. lock (incompleteOrders) { incompleteOrders.Remove(currentOrder); } // Finally if we have no orders left to process // set the finish event to release the main thread if (incompleteOrders.Count == 0) { finishedEvent.Set(); } } else { // else if no available delivery processor, revert the order back to its Processed state currentOrder.currentStatus = Order.Status.Processed; } } }