private void BuildOrderLegs(int commoditySellID, ICollection <int> commodityBuyID, ConcurrentBag <IEnumerable <ProposedOrderLeg> > orderLegs, Dictionary <int, Tuple <IEnumerable <Tuple <ThreadSafeAsk, ThreadSafeAskLeg> >, int> > proposedOrderLegs = null, int legLevel = 0, int maxLegDepth = 5, bool doLock = false) { legLevel++; var targetCommdoity = commoditySellID; ConcurrentDictionary <int, ConcurrentDictionary <long, ThreadSafeAsk> > openAsksByBuyer; if (OpenAsksByBuyerCommdoity.TryGetValue(targetCommdoity, out openAsksByBuyer)) { if (proposedOrderLegs == null) { proposedOrderLegs = new Dictionary <int, Tuple <IEnumerable <Tuple <ThreadSafeAsk, ThreadSafeAskLeg> >, int> >(); } var openAsks = openAsksByBuyer.Where(a => (legLevel < maxLegDepth || commodityBuyID.Contains(a.Key)) && a.Value.Count > 0 && !proposedOrderLegs.ContainsKey(a.Key)).ToArray(); if (legLevel == 1) { Parallel.ForEach(openAsks, commodityGroup => ProcessCommdoityGroup(commodityBuyID, commodityGroup, proposedOrderLegs, orderLegs, legLevel, maxLegDepth, doLock, targetCommdoity)); } else { foreach (var commodityGroup in openAsks) { ProcessCommdoityGroup(commodityBuyID, commodityGroup, proposedOrderLegs, orderLegs, legLevel, maxLegDepth, doLock, targetCommdoity); } } } }
public Task Start() { return(Task.Factory.StartNew(() => { if (Token == null) { Token = new CancellationTokenSource(); } AskRepositoryTask = AskRepository.Start(Token); OpenAsksByBuyerCommdoity.Clear(); OpenAsks.Clear(); var commodities = CommodityRepository.GetCommodities(); Parallel.ForEach(commodities, c => OpenAsksByBuyerCommdoity.AddOrUpdate(c.CommodityID, new ConcurrentDictionary <int, ConcurrentDictionary <long, ThreadSafeAsk> >(), (k, o) => o)); Parallel.ForEach(OpenAsksByBuyerCommdoity, buyCommodityDictionary => { foreach (var commodity in commodities) { buyCommodityDictionary.Value.AddOrUpdate(commodity.CommodityID, new ConcurrentDictionary <long, ThreadSafeAsk>(), (k, o) => o); } }); Parallel.ForEach(AskRepository.GetAsks(), ask => { ThreadSafeAsk tAsk = CreateAsk(new ThreadSafeAsk(ask)); foreach (var commodityBuyID in tAsk.CommodityBuyID) { foreach (var commoditySellID in tAsk.CommoditySellID) { OpenAsksByBuyerCommdoity[commodityBuyID][commoditySellID].AddOrUpdate(tAsk.AskID, tAsk, (k, o) => o); } } OpenAsks.AddOrUpdate(tAsk.AskID, tAsk, (k, o) => o); }); })); }
public void Dispose() { if (Token != null) { Token.Cancel(false); } if (AskProcessorTask != null) { AskProcessorTask.Wait(); } if (AskRepositoryTask != null) { AskRepositoryTask.Wait(); } OpenAsks.Clear(); OpenAsksByBuyerCommdoity.Clear(); }