次の行に沿って、定義されたタイムアウト期間内に終了する必要がある子プロセスを開始しています。
using (Process process = process.Start(startInfo))
{
if (!process.WaitForExit(timeOutMilliSeconds))
{
if (!process.HasExited())
{
process.Kill();
}
}
}
子プロセスは、CPU 集中型の計算エンジン (SAT ソルバー) です。私のメイン プログラムは、Visual Studio 2013とWindows 7 64 ビットC#
を使用して記述および開発されています。
ほとんどの場合、上記のコードは機能し、適切なプロセス タイムアウト終了が達成されます。しかし、ケースの約 5%process.Kill()
では、目に見える効果はありません。子プロセスはアクティブなままです。
優先度の低い子プロセスを開始しようとしました。また、殺す前に一時停止しようとしました。外部ツールとして呼び出すTASKKILL /F
ことも、常に役立つとは限りませんでした。すべての SAT ソルバーで問題が発生するわけではないことに気付きました。管理者権限はありますが、メイン プログラムを管理者として実行していません。
アプリケーションの子プロセスを確実に終了するにはどうすればよいですか?
編集:
タイムアウト バジェットを超えることは別として、子プロセスは非常に正常に動作し、Process Explorer を使用して (管理者の昇格なしで) 手動で強制終了できます。問題は、タイムアウト後にプロセスが実行されていないことを確認する方法です。
回避策: VC++ 2013
を使用してタイムアウト ツールを実装しました。子プロセスを直接呼び出すのではなく、子プロセスを呼び出すツールを呼び出すようになりました。このツールは、CreateProcess()とTerminateProcess()を使用して、子プロセスを開始および停止しています。追加のプロセスを生成せずに、 CreateProcess()およびTerminateProcess()をプログラムから直接呼び出すことはおそらく可能です。
回避策はエレガントではありませんが、私の問題は解決します。C#