このコードは、多数のマシンで期待通りに動作します。しかし、ある特定のマシンでは、WaitForExit()
への呼び出しは無視されているように見え、実際にプロセスは終了したものとしてマークされます。 SOにsimilar questionとは異なり、プロセスが呼び出されていることをProcess.WaitForExitが異なるマシン間で矛盾します
static void Main(string[] args)
{
Process proc = Process.Start("notepad.exe");
Console.WriteLine(proc.HasExited); //Always False
proc.WaitForExit(); //Blocks on all but one machines
Console.WriteLine(proc.HasExited); //**See comment below
Console.ReadLine();
}
注(試験の理由で)notepad.exe
あるので、障害がそれにありそうである - すなわち、それは第2のサブプロセス及び閉鎖を産卵されていません。それでも、それは他のすべてのマシンで動作する理由を説明しません。
Console.WriteLine(proc.HasExited))
への2回目の呼び出しは、メモ帳がまだはっきりと開いているにもかかわらず、画面とタスクマネージャの両方で、true
を返します。
マシンはWindows 7および.NET 4.0を実行しています。
私の質問は、その特定のマシンのどのような条件がこれを引き起こす可能性がありますか?私は何を確認すべきですか?
編集 - 私はこれまで/アップデート/多分関連情報試してみたもの:
- 再インストール.NET。
- タスクマネージャでわからないプロセスは終了しました。
- このマシンでは、Windowsはまだアクティブ化されていません。
- コメントの後、私は
GetProcessesByName
を使って 'existing'プロセスIDを取得しようとしましたが、問題のマシンに空の配列が返されます。したがって、WaitForExit
を呼び出す前でも、GetProcessesByName
を呼び出してプロセスが返されないため、問題がWaitForExit
であっても、それは言うことはできません。 - 問題マシンでは、結果として生じるメモ帳プロセスのParentIDは、コードが手動で開始するメモ帳プロセスのIDです。つまり、メモ帳は子プロセスを作成し、自身を終了しています。
メモ帳が開かれている可能性はありますか?あなたは1つを作成し、1つを殺すが、まだ古いメモ帳を参照してください? 'proc.WaitForExit()'は、新しいプロセスを作成する元のコードの権限が不足しているなど、何らかの理由でプロセスを作成できなかったり、直ちに終了したりした場合、すぐに戻ることがあります。 – oleksii
@oleskii、私はこれを確かめました。メモ帳はここでは "誰もが知っている"プロセスとしてのみ使用されていますが、この問題はプロセスにどのファイルが使用されていても発生します。 – Rotem
@oleskii "proc.WaitForExit()は、プロセスを作成できなかった場合、または何らかの理由で直ちに終了した場合、すぐに戻ることがあります。" - この場合もプロセスは実際に終了しませんか? – Rotem