C# 限制用户处理器时间并使用作业对象查看虚拟内存

C# 限制用户处理器时间并使用作业对象查看虚拟内存,c#,winapi,timing,memory-limit,time-limiting,C#,Winapi,Timing,Memory Limit,Time Limiting,我正在Windows上编写一个应用程序运行程序,它可以限制处理器用户时间和它将运行的应用程序的虚拟内存。我们的想法是: using (JobObject jo = new JobObject()) { // Time jo.Limits.PerProcessUserTimeLimit = TimeSpan.FromMilliseconds(limitTime); jo.Events.OnEndOfProcessTime += new jobEventHandler<

我正在Windows上编写一个应用程序运行程序,它可以限制处理器用户时间和它将运行的应用程序的虚拟内存。我们的想法是:

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();
}
runner.exe mem_limit_in_MB time_limit_in_sec command.exe command_参数

我的调查让我找到了Windows API,因为我正试图从C#中完成所有这些,所以我找到了帮助我的方法

如果出现以下情况,则代码的主要部分:

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();
}
使用(JobObject jo=new JobObject())
{
//时间
jo.Limits.PerProcessUserTimeLimit=TimeSpan.From毫秒(limitTime);
jo.Events.OnEndOfProcessTime+=新的jobEventHandler(事件\u OnEndOfProcessTime);
//记忆
jo.Limits.ProcessMemoryLimit=新的IntPtr(limitMemory);
jo.Events.OnProcessMemoryLimit+=新的jobEventHandler(事件\u OnProcessMemoryLimit);
//过程
ProcessStartInfo psi=新的ProcessStartInfo(命令、参数);
psi.UseShellExecute=false;
psi.0输出=真;
jo.Limits.IsChildProcessBreakAway=false;
进程p=jo.CreateProcessSecured(psi);
p、 WaitForExit();
}
现在的问题是,没有及时调用Events_OnEndOfProcessTime。如果我为一个需要几分钟的应用程序设置了0.5秒的限制,根据运行情况,应用程序会在0.5秒后终止,有时会在4秒后终止。为什么会这样?如果作业对象定期或实时检查限制,我找不到任何参考

我的问题有两个方面: -有人知道我需要的已经开发的代码吗? -有人知道作业对象是定期执行还是实时执行吗


提前感谢…

PerProcessUserTimeLimit指定授予进程的用户模式时间量

“系统定期检查以确定与作业关联的每个进程是否累积了超过设置限制的用户模式时间。如果累积了,则进程终止。”()

因此,这取决于您的应用程序,特别是它在用户模式时间的消耗效率。在0.5秒后以
PerProcessUserTimeLimit=0.5结束进程。意味着在此期间,它使用了约100%的cpu(用户模式)


。。。是否定期或实时执行作业对象?如上所述,周期性地。

我的应用程序正在全速运行用户模式(一个CPU内核全速运行),因此问题可能出在操作系统执行限制检查的频率上。感谢您从MSDN中挖掘关于检查周期的声明。我不知怎么错过了。