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); } } }); }
/// <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); }