public IDisposable Step(string title, IDictionary<string, string> attributes) { var newStep = new TraceStep(title); var newStepElement = new XElement("step", new XAttribute("title", title), new XAttribute("date", DateTime.UtcNow.ToString("MM/dd H:mm:ss"))); foreach (var pair in attributes) { string safeValue = XmlUtility.Sanitize(pair.Value); newStepElement.Add(new XAttribute(pair.Key, safeValue)); } if (_currentSteps.Count == 0) { // Add a new top level step _steps.Add(newStep); } _currentSteps.Push(newStep); _elements.Push(newStepElement); // Start profiling newStep.Start(); return new DisposableAction(() => { try { // If there's no steps then do nothing (guard against double dispose) if (_currentSteps.Count == 0) { return; } // Stop the current step _currentSteps.Peek().Stop(); TraceStep current = _currentSteps.Pop(); XElement stepElement = _elements.Pop(); stepElement.Add(new XAttribute("elapsed", current.ElapsedMilliseconds)); if (_elements.Count > 0) { XElement parent = _elements.Peek(); parent.Add(stepElement); } else { // Add this element to the list Save(stepElement); } if (_currentSteps.Count > 0) { TraceStep parent = _currentSteps.Peek(); parent.Children.Add(current); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }); }
public IDisposable Step(string title, IDictionary <string, string> attributes) { var newStep = new TraceStep(title); var newStepElement = new XElement("step", new XAttribute("title", title), new XAttribute("date", DateTime.UtcNow.ToString("MM/dd H:mm:ss"))); foreach (var pair in attributes) { if (TraceExtensions.IsNonDisplayableAttribute(pair.Key)) { continue; } string safeValue = XmlUtility.Sanitize(pair.Value); newStepElement.Add(new XAttribute(pair.Key, safeValue)); } if (_currentSteps.Count == 0) { // Add a new top level step _steps.Add(newStep); } _currentSteps.Push(newStep); _elements.Push(newStepElement); // Start profiling newStep.Start(); return(new DisposableAction(() => { try { // If there's no steps then do nothing (guard against double dispose) if (_currentSteps.Count == 0) { return; } // Stop the current step _currentSteps.Peek().Stop(); TraceStep current = _currentSteps.Pop(); XElement stepElement = _elements.Pop(); stepElement.Add(new XAttribute("elapsed", current.ElapsedMilliseconds)); if (_elements.Count > 0) { XElement parent = _elements.Peek(); parent.Add(stepElement); } else if (ShouldTrace(stepElement.LastNode as XElement)) { // Add this element to the list Save(stepElement); } if (_currentSteps.Count > 0) { TraceStep parent = _currentSteps.Peek(); parent.Children.Add(current); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } })); }