2017-02-06 1 views
3

Wie kann ich die Startzeit des Child-Prozesses in C# messen? Ich verwende derzeit den folgenden Code zum Messen ausführbare Startzeit und möchte hinzufügen Kind Prozessausführung Startzeit, zum Beispiel CMD laufenden Notizblock oder neue Registerkarte in Chrome.Wie kann ich die Startzeit von Child-Prozessen in C# messen?

Hier ist meine vorhandenen Code für „normale“ Prozess Startzeit Messung: wird

public static long LaunchProcess(String processFullPath) 
     { 
      Process process; 
      var watch = System.Diagnostics.Stopwatch.StartNew(); 

      try 
      { 
       process = Process.Start(processFullPath); 
       process.WaitForInputIdle(); 
       watch.Stop(); 
       etc.... 

Jede Hilfe oder Richtung in hohem Grade geschätzt!

Antwort

1

So ist der Trick, zunächst alle untergeordneten Prozesse zu erkennen:

var mos = new ManagementObjectSearcher($"Select * From Win32_Process Where ParentProcessID={process.Id}"); 

Dann wir sie in Schleife sammeln können und eine neue Task starten die Ausführungszeit zu messen. Am Ende Schleife durch Task Liste und drucken Sie die verstrichene Zeit.

public Tuple<int, TimeSpan> MonitorProcess(Process process) 
{ 
    Stopwatch stopwatch = Stopwatch.StartNew(); 
    process.WaitForExit(); 
    stopwatch.Stop(); 
    return Tuple.Create(process.Id, stopwatch.Elapsed); 
} 

public void LaunchProcess(String processFullPath) 
{ 
    try 
    { 
     var tasks = new List<Task<Tuple<int,TimeSpan>>>(); 
     Process process = Process.Start(processFullPath); 
     if (process == null) return; 

     // Add my current (parent) process 
     tasks.Add(Task.Factory.StartNew(()=>this.MonitorProcess(process))); 

     var childProcesses = new List<Process>(); 
     while (!process.HasExited) 
     { 
      // Find new child-processes 
      var mos = new ManagementObjectSearcher($"Select * From Win32_Process Where ParentProcessID={process.Id}"); 
      List<Process> newChildren = mos.Get().Cast<ManagementObject>().Select(mo => new { PID = Convert.ToInt32(mo["ProcessID"]) }) 
       .Where(p => !childProcesses.Exists(cp => cp.Id == p.PID)).Select(p => Process.GetProcessById(p.PID)).ToList(); 

      // measure their execution time in different task 
      tasks.AddRange(newChildren.Select(newChild => Task.Factory.StartNew(() => this.MonitorProcess(newChild)))); 
      childProcesses.AddRange(newChildren); 
     } 

     // Print the results 
     StringBuilder sb = new StringBuilder(); 
     foreach (Task<Tuple<int, TimeSpan>> task in tasks) { 
      sb.AppendLine($"[{task.Result.Item1}] - {task.Result.Item2}"); 
     } 

     this.output.WriteLine(sb.ToString()); 
    } 
    catch (Exception ex) 
    { 

    } 
} 
+0

Sie sind mein Freund ein Genie! Vielen Dank!! –

+0

Ich bin froh, dass ich @ItamarLevy helfen konnte. Wenn diese oder irgendeine Antwort Ihre Frage gelöst hat, beachten Sie bitte [akzeptieren] (http://meta.stackexchange.com/q/5234/179419), indem Sie auf das Häkchen klicken. Dies zeigt der breiteren Gemeinschaft, dass Sie eine Lösung gefunden haben und sowohl dem Antworter als auch Ihnen einen guten Ruf verschaffen. Es besteht keine Verpflichtung, dies zu tun. –

Verwandte Themen