public void ThreadSafety() { var realTimeHandler = new LiveTradingRealTimeHandler(); var algo = new AlgorithmStub(); algo.SubscriptionManager.SetDataManager(new DataManagerStub(algo)); realTimeHandler.Setup(algo, new AlgorithmNodePacket(PacketType.AlgorithmNode), new BacktestingResultHandler(), null, new TestTimeLimitManager()); // wait for the internal thread to start Thread.Sleep(500); var scheduledEvent = new ScheduledEvent("1", new [] { Time.EndOfTime }, (_, _) => { }); var scheduledEvent2 = new ScheduledEvent("2", new [] { Time.EndOfTime }, (_, _) => { }); Assert.DoesNotThrow(() => { for (var i = 0; i < 100000; i++) { realTimeHandler.Add(scheduledEvent); realTimeHandler.Add(scheduledEvent2); realTimeHandler.Add(scheduledEvent); realTimeHandler.Remove(scheduledEvent); realTimeHandler.Remove(scheduledEvent2); realTimeHandler.Remove(scheduledEvent); } }); realTimeHandler.Exit(); }
/// <summary> /// Select the realtime event handler set in the job. /// </summary> private static IRealTimeHandler GetRealTimeHandler(IAlgorithm algorithm, IBrokerage brokerage, IDataFeed feed, IResultHandler results, AlgorithmNodePacket job) { var rth = default(IRealTimeHandler); switch (job.RealTimeEndpoint) { //Don't fire based on system time but virtualized backtesting time. case RealTimeEndpoint.Backtesting: Log.Trace("Engine.GetRealTimeHandler(): Selected Backtesting RealTimeEvent Handler"); rth = new BacktestingRealTimeHandler(algorithm, job); break; // Fire events based on real system clock time. case RealTimeEndpoint.LiveTrading: Log.Trace("Engine.GetRealTimeHandler(): Selected LiveTrading RealTimeEvent Handler"); rth = new LiveTradingRealTimeHandler(algorithm, feed, results, brokerage, job); break; } return(rth); }