/// <summary>Parses string of process info lines into ProcessInfo objects</summary>
        /// <param name="processesInfoStr"/>
        /// <returns>Map of pid string to ProcessInfo objects</returns>
        internal virtual IDictionary <string, WindowsBasedProcessTree.ProcessInfo> CreateProcessInfo
            (string processesInfoStr)
        {
            string[] processesStr = processesInfoStr.Split("\r\n");
            IDictionary <string, WindowsBasedProcessTree.ProcessInfo> allProcs = new Dictionary
                                                                                 <string, WindowsBasedProcessTree.ProcessInfo>();
            int procInfoSplitCount = 4;

            foreach (string processStr in processesStr)
            {
                if (processStr != null)
                {
                    string[] procInfo = processStr.Split(",");
                    if (procInfo.Length == procInfoSplitCount)
                    {
                        try
                        {
                            WindowsBasedProcessTree.ProcessInfo pInfo = new WindowsBasedProcessTree.ProcessInfo
                                                                            ();
                            pInfo.pid           = procInfo[0];
                            pInfo.vmem          = long.Parse(procInfo[1]);
                            pInfo.workingSet    = long.Parse(procInfo[2]);
                            pInfo.cpuTimeMs     = long.Parse(procInfo[3]);
                            allProcs[pInfo.pid] = pInfo;
                        }
                        catch (FormatException nfe)
                        {
                            Log.Debug("Error parsing procInfo." + nfe);
                        }
                    }
                    else
                    {
                        Log.Debug("Expected split length of proc info to be " + procInfoSplitCount + ". Got "
                                  + procInfo.Length);
                    }
                }
            }
            return(allProcs);
        }
 public override void UpdateProcessTree()
 {
     if (taskProcessId != null)
     {
         // taskProcessId can be null in some tests
         string processesInfoStr = GetAllProcessInfoFromShell();
         if (processesInfoStr != null && processesInfoStr.Length > 0)
         {
             IDictionary <string, WindowsBasedProcessTree.ProcessInfo> allProcessInfo = CreateProcessInfo
                                                                                            (processesInfoStr);
             foreach (KeyValuePair <string, WindowsBasedProcessTree.ProcessInfo> entry in allProcessInfo)
             {
                 string pid = entry.Key;
                 WindowsBasedProcessTree.ProcessInfo pInfo   = entry.Value;
                 WindowsBasedProcessTree.ProcessInfo oldInfo = processTree[pid];
                 if (oldInfo != null)
                 {
                     // existing process, update age and replace value
                     pInfo.age += oldInfo.age;
                     // calculate the delta since the last refresh. totals are being kept
                     // in the WindowsBasedProcessTree object
                     pInfo.cpuTimeMsDelta = pInfo.cpuTimeMs - oldInfo.cpuTimeMs;
                 }
                 else
                 {
                     // new process. delta cpu == total cpu
                     pInfo.cpuTimeMsDelta = pInfo.cpuTimeMs;
                 }
             }
             processTree.Clear();
             processTree = allProcessInfo;
         }
         else
         {
             // clearing process tree to mimic semantics of existing Procfs impl
             processTree.Clear();
         }
     }
 }