예제 #1
0
 private void CreateTickThread(OnTickEH onTick, TickThreadControl ttc)
 {
     Task.Factory.StartNew(() =>
     {
         Tick?tick = null;
         while (ttc.IsRunning)
         {
             lock (ttc.Ticks)
             {
                 if (ttc.Index < ttc.Ticks.Count)
                 {
                     tick = ttc.Ticks[ttc.Index++];
                 }
                 else
                 {
                     tick = null;
                     ttc.Mre.Reset();
                 }
             }
             ttc.Mre.WaitOne();
             if (tick != null)
             {
                 onTick(tick.Value);
             }
         }
     });
 }
예제 #2
0
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="ts">Источник всех сделок по всем инструментам</param>
        //public TickDispatcher(ITickSource ts) : this()
        //{
        //    _tickSource = ts;
        //    _tickSource.OnTick += AddTick;
        //    _tickSource.OnChangeDate += _tickSource_OnChangeDate;
        //}

        #region ITickDispatcher
        /// <summary>
        /// Добавить подписчика на поток сделок по указанному инструменту.
        /// Для одного инструмента можно создавать несколько подписчиков.
        /// </summary>
        /// <param name="subscriber">Объект-подписчик</param>
        /// <param name="insID">Инструмент</param>
        /// <param name="onTick">Callback, который будет вызываться диспетчером при каждой сделке указанного инструмента</param>
        public void Subscribe(object subscriber, int insID, OnTickEH onTick)
        {
            var ticks             = GetTickList(insID);
            TickThreadControl ttc = new TickThreadControl(subscriber, insID, ticks);

            ttc.IsRunning = true;
            CreateTickThread(onTick, ttc);
            _ttcs.Add(ttc);
        }