実行するアプリケーションのプロセッサ ユーザー時間と仮想メモリを制限できる Windows でアプリケーション ランナーを作成しています。アイデアは次のとおりです。
runner.exe mem_limit_in_MB time_limit_in_sec command.exe command_arguments ...
調査の結果、Windows Job Objects API にたどり着きました。C# からすべてを実行しようとしているので、JobObjectWrapperが役立つことがわかりました。
次の場合のコードの主要部分:
using (JobObject jo = new JobObject())
{
// Time
jo.Limits.PerProcessUserTimeLimit = TimeSpan.FromMilliseconds(limitTime);
jo.Events.OnEndOfProcessTime += new jobEventHandler<EndOfProcessTimeEventArgs>(Events_OnEndOfProcessTime);
// Memory
jo.Limits.ProcessMemoryLimit = new IntPtr(limitMemory);
jo.Events.OnProcessMemoryLimit += new jobEventHandler<ProcessMemoryLimitEventArgs>(Events_OnProcessMemoryLimit);
// Process
ProcessStartInfo psi = new ProcessStartInfo(command, arguments);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
jo.Limits.IsChildProcessBreakAway = false;
Process p = jo.CreateProcessSecured(psi);
p.WaitForExit();
}
さて、問題は、Events_OnEndOfProcessTime がタイムリーに呼び出されないということです。数分かかるアプリに 0.5 秒の制限を設定すると、実行中のアプリケーションによっては、0.5 秒後に 1 回、場合によっては 4 秒後に終了します。なぜこうなった?ジョブ オブジェクトが定期的またはリアルタイムで制限をチェックしている場合、参照が見つかりません。
私の質問は 2 つあります。- ジョブ オブジェクトが定期的に実行されるかリアルタイムで実行されるかを知っている人はいますか?
前もって感謝します...