0

次のコードを使用して「不滅の」プロセスを作成したようです。

System.Diagnostics.ProcessStartInfo test = new ProcessStartInfo("cmd", " /c " + aCommandLine); //aCommandLine is : ruby test.rb
test.CreateNoWindow = true;
test.RedirectStandardError = true;
test.RedirectStandardOutput = true;
test.UseShellExecute = false;
test.WorkingDirectory = System.IO.Path.GetDirectoryName(aRTextFilePath);
System.Diagnostics.Process aProcess = Process.Start(test);
aProcess.EnableRaisingEvents = true;
aProcess.Exited += new EventHandler(aProcess_Exited);
try
{
    //read synchronously to get the port number
    string aPortInformationLine = aProcess.StandardOutput.ReadLine();
    if (!aProcess.HasExited)
    {
        aProcess.Kill();
        Debug.Print("Process Has Exited");
    }
    //return true;
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}", aCommandLine, aRTextFilePath);
    port = -1;
    return false;
}
catch (Win32Exception ex)
{
    Debug.WriteLine(ex.NativeErrorCode.ToString());
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}. Error : {2}", aCommandLine, aRTextFilePath, ex.NativeErrorCode.ToString());
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}. Error : {2}", aCommandLine, aRTextFilePath, ex.Message);
}

だから私はcmdを使ってある種のrubyサーバーを起動しています。プロセスが開始され、新しく作成されたプロセスからの出力を読み取ることができます。ただし、killコマンドが実行されると、例外はスローされませんが、rubyプロセスは終了しません。

これはcmdの使用と関係がありますか?私は何か他のことを間違っていますか?ありがとう

編集:

私はProcessExplorerを使用し、キルの前後に2枚の写真を撮りました。

前:

BeforeKill 後:

AfterKill

したがって、cmd.exeが停止している間、rubyはなんとか続けて、別の日を見るために生きることができます。

Edit2:

私の問題への回答:C#でプログラム的にプロセスツリーを強制終了します

4

3 に答える 3

1

コマンドプロセッサを強制終了すると、それによって開始されたプロセスもすべて強制終了されるというあなたの希望は、アイドル状態のプロセスです。Windowsはそのようには機能しません。Windows、ジョブオブジェクトにはそのためのメカニズムがありますが、そこには行きたくありません。cmd.exeは使用しないでください。値は追加されません。ruby.exeを直接起動します。

于 2012-11-17T14:19:00.953 に答える
0

MSDNから:

Killメソッドは非同期で実行されます。Killメソッドを呼び出した後、WaitForExitメソッドを呼び出してプロセスが終了するのを待つか、HasExitedプロパティをチェックしてプロセスが終了したかどうかを確認します。

于 2012-11-17T11:42:07.130 に答える
0

プロセスにバックグラウンドスレッドとして宣言されていないスレッドがあるかどうかを確認してください。そして、そのプロセスには無限ループが含まれる可能性があります。

于 2012-11-17T12:14:46.487 に答える