private void UpdateCPULimits() { NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION cpuRateControlLimit = new NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION(); if (this.cpuPercentageLimit != 0) { cpuRateControlLimit.ControlFlags = (uint)( NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP ); cpuRateControlLimit.CpuRate = (uint)Math.Floor(this.cpuPercentageLimit * 100); int cpuRateControlLimitLength = Marshal.SizeOf(typeof(NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION)); IntPtr cpuRateControlLimitPtr = Marshal.AllocHGlobal(cpuRateControlLimitLength); try { Marshal.StructureToPtr(cpuRateControlLimit, cpuRateControlLimitPtr, false); bool success = NativeMethods.SetInformationJobObject(this.jobHandle, NativeMethods.JobObjectInfoClass.JobObjectCpuRateControlInformation, cpuRateControlLimitPtr, (uint)cpuRateControlLimitLength); if (success == false) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error, "SetInformationJobObject failed for setting CPU limits."); } } finally { Marshal.FreeHGlobal(cpuRateControlLimitPtr); } } }