我正在Windows上编写一个应用程序运行程序,它可以限制处理器用户时间和将运行的应用程序的虚拟内存。想法是有以下内容:
runner.exe mem_limit_in_MB time_limit_in_sec命令.exe命令参数。。。
我的调查让我找到了Windows作业对象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秒后终止。为什么会发生这种情况?如果作业对象定期或实时检查限制,我找不到任何参考。
我的问题有两个方面:-有人知道我需要的已经开发的代码吗?-有人知道作业对象是定期执行还是实时执行吗?
提前感谢。。。
PerProcessUserTimeLimit指定授予进程的用户模式时间。
"系统定期检查,以确定与作业相关的每个进程是否累积了超过设置限制的用户模式时间。如果累积了,则终止该进程。"(MSDN)
因此,这取决于您的应用程序,尤其是它消耗用户模式时间的效率。0.5秒后用PerProcessUserTimeLimit = 0.5
结束进程意味着在这段时间内它使用了大约100%的cpu(用户模式)。
。。。作业对象是定期执行还是实时执行如上所述,定期。