private void ProcessIndicator(IndicatorToken token, IIndicatorValue input) { if (token.Indicator.CanProcess(input)) { Container.AddValue(token, input, token.Indicator.Process(input)); } }
/// <summary> /// Сообщить, что данный токен больше не требуется. /// Если количество вызовов будет равно количеству вызовов <see cref="RegisterIndicator"/>, то все данные по индикатору будут удалены. /// </summary> /// <param name="indicatorToken">Токен индикатора.</param> public virtual void UnRegisterIndicator(IndicatorToken indicatorToken) { lock (_indicatorUsages.SyncRoot) { var inDict = _indicatorUsages[indicatorToken]; if (inDict.Second <= 0) { throw new InvalidOperationException(); } if (--inDict.Second == 0) { _indicatorUsages.Remove(indicatorToken); //чистим значения в контейнере Container.RemoveIndicator(indicatorToken); //удаляем из списка источника lock (_sources.SyncRoot) { var indicators = _sources.TryGetValue(indicatorToken.Source); if (indicators != null) { indicators.Remove(indicatorToken); } } } } }
/// <summary> /// Зарегистрировать индикатор. После регистрации данный индикатор начнет обновляться с использованием переданного источника. /// Если по данному источнику уже есть сохраненные данные, то они будут использованы для инициализации индикатора. /// Если пара индикатор-источник уже была ранее зарегистрирована, то вернется существующий токен. /// </summary> /// <param name="indicator">Индикатор.</param> /// <param name="source">Источник данных для индикатора.</param> /// <returns>Токен, который был зарегистрирован.</returns> public virtual IndicatorToken RegisterIndicator(IIndicator indicator, IIndicatorSource source) { lock (_indicatorUsages.SyncRoot) { var token = new IndicatorToken(indicator, source); var inDict = _indicatorUsages.TryGetValue(token); if (inDict != null) { //найден индикатор, увеличим количество ссылок inDict.Second++; return(inDict.First); } //индикатора нет, добавим lock (_sources.SyncRoot) { var indicators = _sources.SafeAdd(source, key => new IndicatorList(this, key)); token = new IndicatorToken(indicator, indicators.Source) { Container = Container }; _indicatorUsages.Add(token, new RefPair <IndicatorToken, int>(token, 1)); indicators.Add(token); // тут пройдет подписка на события источника и обработка тех значений, которые уже есть в источнике } return(token); } }
public ResetEventHandler(IndicatorToken token, IndicatorManager manager) { Token = token; _manager = manager; ResetHandler = OnReset; Token.Indicator.Reseted += ResetHandler; }
private void ProcessIndicator(IndicatorToken token) { lock (_indicatorUsages.SyncRoot) { var inputs = Container.GetInputs(token.Source); if (inputs != null) { inputs.ForEach(i => ProcessIndicator(token, i)); } } }