2016-11-18 2 views
-1

Ich laufe in eine seltsame Sache und kann nicht den Grund finden, warum dies geschieht.Start Prozess von Service hängt UseShellExecute false

Ich habe eine service.exe, wo ich Daten aus der Konfigurationsregistrierung sammeln und dann n Prozesse starten.

Beispielcode:

_mProcess.StartInfo = new ProcessStartInfo 
{ 
    FileName = Command, 
    Arguments = Argument, 
    WorkingDirectory = WorkDir 
}; 
_mProcess.Start(); 
Pid = _mProcess.Id; 

Mein Pid enthält die Prozess-ID.

Jetzt habe ich UseShellExecute = false hinzugefügt, um den StandardOutput zu bekommen.

Neuer Beispielcode:

_mProcess.StartInfo = new ProcessStartInfo 
{ 
    FileName = Command, 
    Arguments = Argument, 
    WorkingDirectory = WorkDir //, 
    //CreateNoWindow = true, 
    UseShellExecute = false, 
    //RedirectStandardOutput = true, 
    RedirectStandardError = true 
    //RedirectStandardInput = true 
}; 
_mProcess.Start(); 
Pid = _mProcess.Id; 

using (var reader = _mProcess.StandardError) 
{ 
    _logger.ToLog("", Company, reader.ReadToEnd(), "RCluster.log", "service"); 
} 

In diesem Fall wird der Prozess einen Fehler wieder zurück, das ich meine Log-Datei speichern kann.

Problem: Dieser Code ist Teil einer Methode, um einen Prozess zu starten, den ich viele Male aufrufen (hängt von meiner Konfiguration ab). Also mit diesem Code wird der erste Prozess aufgerufen, die folgenden Prozesse nicht. Irgendwie warten die Dienste jetzt auf den ersten Dienst. Ich dachte, das passiert nur mit WaitForExit.

So, wie ich Standardfehlerausgabe erhalten kann, aber nicht den Prozessblock meine Hauptaufgabe machen, um fortzufahren?

+0

Ihr Prozess wartet darauf, dass der Fehlerleser das Ende des Streams findet, sodass er blockiert wird, bis der Prozess abgeschlossen ist. Starten Sie die Fehlerverarbeitung in einem anderen Thread oder einer asynchronen Task. – Gusman

Antwort

0

@Gusman: Fügen Sie Ihren Kommentar als Antwort, brachten Sie mich zur richtigen Antwort. Dann kann ich deinen Kommentar als Antwort akzeptieren.

Zum Down-Voter: Erklärung warum würde geschätzt werden.

An alle: Ich habe etwas Code hinzugefügt, um den neuen Prozess als Thread zu starten. In diesem Fall ist es sinnvoll, es in einem anderen Thread zu starten, um `StandardError'-Nachrichten zu lesen, aber den Hauptprozess nicht zu blockieren (was in meinem Fall ein Dienst ist, der viele Unterprozesse startet).

 // start as new thread to prevent blocking 
     var ths = new ThreadStart(() => 
     { 
     mProcess.Start(); 
     Pid = mProcess.Id; 

     // write pid file 
     File.WriteAllText(RubyDir + @"\tmp\pids\" + Port + @".pid", Pid.ToString()); 

     using (var reader = mProcess.StandardError) 
     { 
      var errorMsg = reader.ReadToEnd(); 
      if (errorMsg.Length > 0) _logger.ToLog("", Company, errorMsg, "SOLR.log", "service"); 
     } 
     }); 
     var th = new Thread(ths); 
     th.Start();