Пример #1
0
        public VariableSubscription Subscribe(
            int frameIndex,
            string variableExpression,
            Action<DebugEvaluationResult> executeAction) {

            var token = new VariableSubscriptionToken(frameIndex, variableExpression);

            var subscription = new VariableSubscription(
                token,
                executeAction,
                Unsubscribe);

            lock (_subscribers) {
                List<VariableSubscription> subscriptions;
                if (_subscribers.TryGetValue(subscription.Token, out subscriptions)) {
                    subscriptions.Add(subscription);
                } else {
                    _subscribers.Add(
                        token,
                        new List<VariableSubscription>() { subscription });
                }
            }

            return subscription;
        }
        public VariableSubscription(
            VariableSubscriptionToken token,
            Action<DebugEvaluationResult> executeAction,
            Action<VariableSubscription> unsubscribeAction) {

            Token = token;

            _weakReference = new WeakReference(executeAction.Target);
            _method = executeAction.Method;
            _delegateType = executeAction.GetType();

            _unsubscribe = unsubscribeAction;
        }
Пример #3
0
        private async Task PublishAsync(VariableSubscriptionToken token, IList<VariableSubscription> subscriptions) {
            if (subscriptions.Count == 0) {
                return;
            }

            Debug.Assert(_debugSession != null);

            var stackFrames = await _debugSession.GetStackFramesAsync();
            var stackFrame = stackFrames.FirstOrDefault(f => f.Index == token.FrameIndex);

            if (stackFrame != null) {
                const DebugEvaluationResultFields fields = DebugEvaluationResultFields.Classes
                    | DebugEvaluationResultFields.Expression
                    | DebugEvaluationResultFields.TypeName
                    | (DebugEvaluationResultFields.Repr | DebugEvaluationResultFields.ReprStr)
                    | DebugEvaluationResultFields.Dim
                    | DebugEvaluationResultFields.Length;

                DebugEvaluationResult evaluation = await stackFrame.EvaluateAsync(token.Expression, fields: fields);

                foreach (var sub in subscriptions) {
                    try {
                        var action = sub.GetExecuteAction();
                        if (action != null) {
                            action(evaluation);
                        }
                    } catch (Exception e) {
                        Debug.Fail(e.ToString());
                        // swallow exception and continue
                    }
                }
            }
        }