我正在 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 秒后终止,有时在 4 秒后终止。为什么会这样?如果作业对象定期或实时检查限制,我找不到任何参考。
我的问题有两个: - 有人知道已经开发的代码可以满足我的需要吗?- 有谁知道作业对象是定期执行还是实时执行?
提前致谢...