//ManualResetEvent m_mreWaitForSample = new ManualResetEvent(false); /// <summary> /// takes several callstack samples from the process over time and creates a call tree, where performance issues can be evaluated. /// </summary> /// <param name="onlyMainThread"></param> /// <returns>a dictionary of [threadId,StackTreeRoot]</returns> public Dictionary<int, StackTreeNode> GetPerformanceSample(bool onlyMainThread = false) { ProcessSampler sampler = new ProcessSampler(onlyMainThread); if (m_blnIsListening) { throw new Exception("can't take samples while listning!"); //if (m_process.IsRunning) //{ // m_process.AsyncStop().WaitOne(); // m_process.CorProcess.Stop(0); //} //List<ProcessSample> sample = sampler.GetSample(m_process, 20, 200); //return sampler.CreateStackTrees(sample); } else { int timeBetweenSamples = Config.GetIntValue(Config.PerfTimeBetweenSamples); if (timeBetweenSamples == int.MinValue) timeBetweenSamples = 400; List<ProcessSample> sample = sampler.GetSample(m_processId, m_intNumSamplesInPerf, timeBetweenSamples, false, true); return sampler.CreateStackTrees(sample); } }
/// <summary> /// takes a single callstack snapshot from the process. /// </summary> /// <param name="onlyMainThread"></param> /// <returns></returns> public List<ProcessSample> GetCallStacks(bool onlyMainThread = false, bool extraDetails = false) { List<ProcessSample> sample; ProcessSampler sampler = new ProcessSampler(onlyMainThread); if (m_blnIsListening) { throw new Exception("can't take samples while listning!"); //if (m_process.IsRunning) //{ // m_process.AsyncStop().WaitOne(); // m_process.CorProcess.Stop(0); //} //sample = sampler.GetSample(m_process, 1, 200); } else { sample = sampler.GetSample(m_processId, 1, 200, extraDetails); } return sample; }