/// <summary> /// Method for generating fake data /// </summary> private void UpdateData() { // Method to change the values of all the stocks randomly in a fixed range List<StockModel.Symbol> symbols = InMemoryObjects.ExchangeSymbolList.SingleOrDefault(x => x.Exchange == Exchange.FAKE_NASDAQ).Symbols; Feed[] feedsArray = new Feed[symbols.Count]; List<SymbolFeeds> symbolFeeds = new List<SymbolFeeds>(); while (true) { Thread.Sleep(updateDurationTime); Parallel.ForEach(symbols, (symbol) => { SymbolFeeds feeds = new SymbolFeeds(); feeds.SymbolId = symbol.Id; double changePercent = random.NextDouble() * (Constants.MAX_CHANGE_PERC - Constants.MIN_CHANGE_PERC) + Constants.MIN_CHANGE_PERC; symbol.DefaultVal = symbol.DefaultVal + symbol.DefaultVal * changePercent / 100; Feed feed = new Feed(); feed.SymbolId = symbol.Id; feed.LTP = symbol.DefaultVal; feed.TimeStamp = Convert.ToInt64((DateTime.Now - epoch).TotalMilliseconds); if (FeedArrived != null) FeedArrived((Feed)feed.Clone()); //notify subscribers - later to be changed to only notify if there is any new data Notify(symbol.Id, feed); }); } }
/// <summary> /// Method for notifying all subscribers that feed has arrived. /// </summary> /// <param name="symbolId">Id of the symbol for which feed has arrived</param> /// <param name="fd">Feed</param> private void Notify(int symbolId, Feed fd) { lock (_lockSubscription) { if (notifyList.ContainsKey(symbolId)) { foreach (OnFeedReceived hndl in notifyList[symbolId]) { try { //send a copy hndl((Feed)fd.Clone()); } catch { //ignore... } } } } }