Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
 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);
         });
     }));
 }
Пример #3
0
 public void Dispose()
 {
     if (Token != null)
     {
         Token.Cancel(false);
     }
     if (AskProcessorTask != null)
     {
         AskProcessorTask.Wait();
     }
     if (AskRepositoryTask != null)
     {
         AskRepositoryTask.Wait();
     }
     OpenAsks.Clear();
     OpenAsksByBuyerCommdoity.Clear();
 }