/// <summary> /// Places a new order and assigns a new broker ID to the order /// </summary> /// <param name="order">The order to be placed</param> /// <returns>True if the request for a new order has been placed, false otherwise</returns> public override bool PlaceOrder(Order order) { var submitted = false; _messageHandler.WithLockedStream(() => { submitted = ApiClient.PlaceOrder(order); }); return(submitted); }
public void MessagesHandledCorrectly() { const int expectedCount = 10000; var numbers = new List <string>(); void Action(string number) => numbers.Add(number); var handler = new BrokerageConcurrentMessageHandler <string>(Action); var task = Task.Factory.StartNew(() => { var counter = 0; for (var i = 0; i < expectedCount; i++) { handler.HandleNewMessage($"{Interlocked.Increment(ref counter)}"); if (i % 50 == 0) { Thread.Sleep(1); } } }); for (var i = 0; i < expectedCount;) { handler.WithLockedStream(() => { // place order i++; }); if (i % 50 == 0) { Thread.Sleep(1); } } if (!task.Wait(TimeSpan.FromSeconds(5))) { Assert.Fail("BrokerageConcurrentMessageHandlerTests.MessagesHandledCorrectly(): timeout waiting for task to finish"); } // all processed Assert.AreEqual(expectedCount, numbers.Count); for (var i = 0; i < numbers.Count; i++) { // all in order Assert.AreEqual($"{i + 1}", numbers[i]); } }