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