2015-02-08 10 views
6

Ho costruito Form App che uso per qualche tempo, ora voglio prendere il StandardError del mio processo così come la sua standartOutputpotete ottenere output di errore di processo utilizzando process.ErrorDataReceived C#

Ho guardato risposte in SO e MSDN e tuttavia e non posso farlo bene

Il mio codice:

 public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true) 
     { 
     process = new Process(); 

          process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); 
     if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); 

     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 

     process.StartInfo.CreateNoWindow = true; 

     process.StartInfo.UseShellExecute = false; 

     process.StartInfo.FileName = FileName; 
     process.StartInfo.Arguments = Arguments;  
     if (EventWhenExit) 
     { 
      process.EnableRaisingEvents = true; 
      process.Exited += new EventHandler(myprocess_Exited); 
     } 


     process.Start(); 
     process.BeginOutputReadLine(); 
     //run polling on stored logs to print them to screen 
     PollingService(); 
     } 

ho controllare con Iperf e vedo che quando l'eseguo con l'argomento corretto ricevo uscita corretta ma quando basta inviare con qualsiasi argumnet vedo che con cmd ricevo

C:\>iperf.exe 
Usage: iperf [-s|-c host] [options] 
Try `iperf --help' for more information. 

E la mia app ottengo Niente !

cosa mi manca qui? Grazie

È possibile interrompere la lettura qui! Se si desidera visualizzare i dettagli di metodo interno continuerà sotto:

private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e) 
    { 
     string ProcessOutput = e.Data; 
     ProcessLog.Add(e.Data); 
    } 

    private void PollingService() 
    { 
     var T = new Thread (()=> 
     { 
      while (true /* ProcessRunning*/) 
      { 
       if (ProcessLogIndex < ProcessLog.Count) 
       { 
        lock (this) 
        { 
         var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex); 
         ProcessLogIndex = ProcessLog.Count; 
         foreach (var ToSend in tempList) 
         { 
          onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString()); 
         } 

        } 

       } 
       Thread.Sleep(400); 
      } 
     }); 
     T.IsBackground = true; 
     T.Start(); 
    } 

risposta

7

non vedo una chiamata a BeginErrorReadLine() in qualsiasi parte del codice che avete inviato. Se non si chiama quel metodo, la classe Process non reindirizzerà effettivamente lo stderr al gestore di eventi.

Credo che quanto sopra è il problema, ma se in realtà lo si chiama da qualche parte (e non lo si è mostrato), allora vale la pena considerare che ci sono alcuni programmi di console strani che non vengono effettivamente utilizzati stderr (o stdout) per l'output di errore. Invece, scrivono direttamente nella finestra della console o in un altro meccanismo non standard. In questi casi, non sarai in grado di ricevere l'output di errore reindirizzando stderr.

È possibile identificare quei programmi reindirizzando il loro output al comando come ad es. iperf.exe 2> foo.txt. L'handle del file stderr è 2 e pertanto la sintassi reindirizza il file a un file denominato foo.txt. Se il file è vuoto e vedi degli errori sullo schermo, allora il programma è uno di quei strani programmi.

Ma davvero, penso che probabilmente hai semplicemente dimenticato di chiamare BeginErrorReadLine(). :)

+0

sei così GIUSTO! :) Non posso credere di averlo dimenticato – LordTitiKaka

Problemi correlati