Example #1
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="source">Origen</param>
 internal protected IData(ITopologyItem source)
 {
     _IsCached = false;
     _Source   = source;
 }
Example #2
0
        /// <summary>
        /// Procesa los datos
        /// </summary>
        /// <param name="data">Datos</param>
        /// <param name="caller">Item que lo llama</param>
        /// <param name="state">Estado de la enumeración</param>
        public void ProcessData(IData data, ITopologyItem caller, EEnumerableDataState state)
        {
            if (data == null)
            {
                return;
            }

            // Si tiene varios origenes de datos, se tiene que esperar a estan todos llenos
            IData jdata;

            if (_Data.Count > 1 && CallMethod != ECallMode.PeerCall)
            {
                // Esperamos a que el conjunto esperado esté disponible
                if (!_Data.SetData(data, caller) && CallMethod == ECallMode.WaitAll)
                {
                    return;
                }

                if (_IsBusy)
                {
                    return;
                }
                _IsBusy = true;

                // Los datos a devolver tienen que ser los del array
                jdata = new DataJoin(this, _Data.Items)
                {
                    HandledDispose = true
                };
            }
            else
            {
                if (_IsBusy)
                {
                    return;
                }
                _IsBusy = true;

                jdata = data;
            }

            // Procesa los datos
            RaiseOnProcess(EProcessState.PreProcess);

            IData ret;

            try
            {
                ret = OnProcessData(jdata, state);
            }
            catch (Exception e)
            {
                OnError(e);
                ret = null;
            }

            RaiseOnProcess(EProcessState.PostProcess);

            // Siempre que no sea null se reenvia a otros nodos
            if (ret != null && !(ret is DataBreak))
            {
                // Se los envia a otros procesadores
                Process.ProcessData(this, ret, UseParallel);

                // Liberación de recursos
                if (ret != data && !ret.HandledDispose)
                {
                    ret.Dispose();
                }
            }

            _IsBusy = false;
        }