public void StartTrace() { lock (locker) { int currentThreadId = Thread.CurrentThread.ManagedThreadId; // выбираем поток из существующих if (traceResult.threads.ContainsKey(currentThreadId)) { // определяем метод StackFrame newFrame = new StackFrame(1); string className = newFrame.GetMethod().DeclaringType.ToString(); string methodName = newFrame.GetMethod().Name; // инициализация при первом запуске if (traceResult.threads.Count > 0) { MethodResult tempMethod = InitializeMethod(currentThreadId, methodName, className); // измерение времени выполения tempMethod.timer.Start(); // добавляем в стек для сохранения иерархии traceResult.threads[currentThreadId].stack.Push(tempMethod); } } else { // инициализация нового потока InitializeThread(currentThreadId); // измерение времени выполения traceResult.threads[currentThreadId].timer.Start(); } } }
public MethodResult Add(MethodResult tr) { tr.parent = this; children.Add(tr); return(children[children.Count - 1]); }