2016-05-12 5 views
0

私はnodejsをC#アプリケーション内のプロセスとして開始しています。私の意図は、毎回プロセスが再開することです。ここC#のプロセスとしてnodejsを再起動

_nodeProcess = new Process 
{ 
    StartInfo = 
    { 
     UseShellExecute = false, 
     RedirectStandardOutput = true, 
     RedirectStandardError = true, 
     RedirectStandardInput = true, 
     WorkingDirectory = location, 
     FileName = "node.exe", 
     Arguments = "main.js" 
    } 
}; 

_nodeProcess.EnableRaisingEvents = true; 
_nodeProcess.Exited += nodeExited; 

_nodeProcess.Start(); 

string stderrStr = _nodeProcess.StandardError.ReadToEnd(); 
string stdoutStr = _nodeProcess.StandardOutput.ReadToEnd(); 

if (!String.IsNullOrWhiteSpace(stderrStr)) 
{ 
    LogInfoMessage(stderrStr); 
} 

LogInfoMessage(stdoutStr); 
_nodeProcess.WaitForExit();  

_nodeProcess.Close(); 

nodeExited方法である:プロセスを開始するため

コードがある

private void nodeExited(object sender, EventArgs e) 
{ 
    if (!_isNodeStop) 
    { 
     this.restartERM_Click(sender, e); 
    } 
    else 
    { 
     _isNodeStop = false; 
    } 
} 

_isNodeStopが制御場所からノードを殺したときに私がtrueに設定さジュスタのフラグです。

このように:

private void KillNode() 
{ 
    foreach (var process in Process.GetProcessesByName("node")) 
    { 
     _isNodeStop = true; 
     process.Kill(); 
    } 
} 

私の問題は、nodeExited方法は、ノードが停止されるたびにトリガしないということです。私は理由を知りませんし、どんなパターンも見えませんでした。ただ、ほとんどの時間を止めることはできません。

答えて

1

とにかくWaitForExit()を使用しているため、Exitedイベントを使用する理由はありません。

ただ、手動で次のように)(WaitForExit後にハンドラを呼び出す:私が正しくthis答えを理解していれば、あなたも持っているかもしれません

_nodeProcess.WaitForExit();  
_nodeProcess.Close(); 
nodeExited(_nodeProcess, new EventArgs()); 

_nodeProcess.EnableRaisingEvents = true; 
_nodeProcess.Exited += nodeExited; 

編集を削除あなたはStandardError.ReadToEnd();に電話をしてからStandardOutput.ReadToEnd();に電話をかけたのでデッドロックします。 StandardOutput Bufferは、そのポイントに達する前にいっぱいになっている可能性があります。

+0

編集について:私はこれが問題ではないと信じています。最初に出力を読み込み、次にエラーを読み込みます。 – eomeroff

関連する問題