2016-11-18 3 views
-1

私は奇妙なことに遭遇し、これが起こっている理由を見つけることができません。サービスがハングしてからプロセスを開始するUseShellExecute false

私は構成レジストリからデータを収集し、n個のプロセスを開始するservice.exeを持っています。

サンプルコード:

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

マイPidは、プロセスIDが含まれています。

標準出力を取得するためにUseShellExecute = falseを追加しました。

新しいサンプルコード:プロセスは、私は私のログファイルに保存することができます任意のエラーが戻らこの場合

_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"); 
} 

問題:このコードは、私が何度も呼び出すプロセスを開始する方法の一部です(構成によって異なります)。 このコードでは、最初のプロセスが呼び出されますが、次のプロセスは呼び出されません。 何とかサービスが最初のサービスを待っています。私はこれがWaitForExitとしか起こらないと思った。

どのように標準エラー出力を得ることができますが、プロセスを続行するためにメインタスクをブロックしないようにしますか?

+0

プロセスはエラーリーダーがストリームの終わりを見つけるのを待っているので、プロセスが終了するまでブロックされます。別のスレッドまたは非同期タスクでエラー処理を開始します。 – Gusman

答えて

0

@Gusman:答えとしてコメントを追加すると、正しい答えが表示されます。それで私は答えとしてあなたのコメントを受け入れることができます。

ダウン投票者に:理由はわかります。

すべて:新しいプロセスをスレッドとして開始するためのコードを追加しました。この場合、 `StandardErrorメッセージを取得するために別のスレッドで起動するのは理にかなっていますが、メインプロセス(私の場合は多くのサブプロセスを起動するサービス)をブロックしないでください。

 // 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(); 
関連する問題