예제 #1
0
        internal ReflectTransformBlock(TransformBlock <TIn, TOut> block, IBlockInitializer propertySetter)
            : base(block, propertySetter)
        {
            if (block == null)
            {
                return;
            }

            #region targetCoreField

            FieldInfo  targetCoreField = block.GetType().GetField("m_target", ReflectBlockExtensions.DEFAULT_FLAGS);
            object     targetCore      = targetCoreField.GetValue(block);
            MethodInfo getTargetDebuggingInformationMethod =
                targetCore.GetType().GetMethod("GetDebuggingInformation", ReflectBlockExtensions.DEFAULT_FLAGS);
            _targetDebugInfo = getTargetDebuggingInformationMethod.Invoke(targetCore, new object[0]);

            #endregion // targetCoreField

            //propertySetter.AddProperty("Input Count", () => block.InputCount, 3, Colors.White);
            //propertySetter.AddProperty("Output Count", () => block.OutputCount, 4, Colors.White);

            propertySetter.SetInputQueueFactory(() => ReflectBlockExtensions.GetInputQueue(_targetDebugInfo));
            //propertySetter.SetOutputQueueFactory(() => ReflectBlockExtensions.GetOutputQueue(_sourceDebugInfo));
            propertySetter.SetPostponedMessagesFactory(() => ReflectBlockExtensions.GetProsponedQueue(_targetDebugInfo));

            propertySetter.AddProperty("Current Parallelism", () => ReflectBlockExtensions.GetCurrentDegreeOfParallelism(_targetDebugInfo), 60, Colors.WhiteSmoke);

            //propertySetter.SetBlockOptions(ReflectBlockExtensions.GetDataflowBlockOptions(_targetDebugInfo));
        }
        private void InitProperties(IDataflowBlock block, IBlockInitializer propertySetter)
        {
            propertySetter.SetInputQueueFactory(() => ReflectBlockExtensions.GetInputQueue(_debugInfo));
            propertySetter.SetPostponedMessagesFactory(() => ReflectBlockExtensions.GetProsponedQueue(_debugInfo));

            propertySetter.AddProperty("Current Parallelism", () => ReflectBlockExtensions.GetCurrentDegreeOfParallelism(_debugInfo), 60, Colors.WhiteSmoke);
            propertySetter.AddProperty("Is Completed", () => ReflectBlockExtensions.GetIsCompleted(_debugInfo), 61, Colors.WhiteSmoke);
            propertySetter.AddProperty("Declined Permanently", () => ReflectBlockExtensions.GetIsDecliningPermanently(_debugInfo), 62, Colors.WhiteSmoke);


            propertySetter.SetBlockOptions(ReflectBlockExtensions.GetDataflowBlockOptions(_debugInfo));
        }
        private void SetBoundingState(IDataflowBlock block, IBlockInitializer propertySetter)
        {
            FieldInfo field =
                block.GetType().GetField("m_boundingState", ReflectBlockExtensions.DEFAULT_FLAGS);
            object boundingState = field.GetValue(block);

            if (boundingState != null)
            {
                #region TaskForInputProcessing

                FieldInfo fieldTaskForInputProcessing =
                    boundingState.GetType().GetField("TaskForInputProcessing", ReflectBlockExtensions.DEFAULT_FLAGS);
                propertySetter.AddProperty("Is Processing Input",
                                           () =>
                {
                    Task taskForInputProcessing = fieldTaskForInputProcessing.GetValue(boundingState) as Task;
                    if (taskForInputProcessing == null)
                    {
                        return(false);
                    }
                    return(taskForInputProcessing.Status == TaskStatus.Running);
                }, 9, Colors.White);

                #endregion // TaskForInputProcessing

                #region PostponedMessages

                FieldInfo fieldPostponedMessages =
                    boundingState.GetType().GetField("PostponedMessages", ReflectBlockExtensions.DEFAULT_FLAGS);

                Func <IEnumerable <PostponedMessage> > postponedMessagesFactory = () =>
                {
                    var kvc = fieldPostponedMessages.GetValue(boundingState) as IEnumerable <KeyValuePair <ISourceBlock <T>, DataflowMessageHeader> >;

                    var result = from pair in kvc
                                 select new PostponedMessage(pair.Key, pair.Value);

                    return(result);
                };

                propertySetter.SetPostponedMessagesFactory(postponedMessagesFactory);

                #endregion // PostponedMessages
            }
        }