Пример #1
0
        /// <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]);
            }
        }