Tôi đã gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách sử dụng cấu trúc SetInformationJobObject Kernel32 Win Api và JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.
Vấn đề lớn hơn của tôi là đại diện cho cấu trúc này trong C# (sử dụng "union"). Hy vọng rằng, tôi tìm thấy một mô tả "mono" của cấu trúc này.
[StructLayout(LayoutKind.Explicit)]
//[CLSCompliant(false)]
struct JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
{
[FieldOffset(0)]
public UInt32 ControlFlags;
[FieldOffset(4)]
public UInt32 CpuRate;
[FieldOffset(4)]
public UInt32 Weight;
}
Để kích hoạt giới hạn Cpu:
ControlFlags = 0x00000001 | 0x00000004;
CpuRate = percent of max usage * 100 (ex 50 * 100 for a 50% limit)
Các mẫu dưới đây là đầy đủ chức năng.
Tôi hy vọng đó là trợ giúp.
Kind Regards
-Thierry-
[DllImport("kernel32.dll", EntryPoint = "CreateJobObjectW", CharSet = CharSet.Unicode)]
public static extern IntPtr CreateJobObject(SecurityAttributes JobAttributes, string lpName);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess);
[DllImport("kernel32.dll")]
static extern bool SetInformationJobObject(IntPtr hJob, JOBOBJECTINFOCLASS JobObjectInfoClass, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength);
public class SecurityAttributes
{
public int nLength;
public IntPtr pSecurityDescriptor;
public bool bInheritHandle;
public SecurityAttributes()
{
this.bInheritHandle = true;
this.nLength = 0;
this.pSecurityDescriptor = IntPtr.Zero;
}
}
public enum JOBOBJECTINFOCLASS
{
JobObjectAssociateCompletionPortInformation = 7,
JobObjectBasicLimitInformation = 2,
JobObjectBasicUIRestrictions = 4,
JobObjectEndOfJobTimeInformation = 6,
JobObjectExtendedLimitInformation = 9,
JobObjectSecurityLimitInformation = 5,
JobObjectCpuRateControlInformation = 15
}
[StructLayout(LayoutKind.Explicit)]
//[CLSCompliant(false)]
struct JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
{
[FieldOffset(0)]
public UInt32 ControlFlags;
[FieldOffset(4)]
public UInt32 CpuRate;
[FieldOffset(4)]
public UInt32 Weight;
}
public enum CpuFlags
{
JOB_OBJECT_CPU_RATE_CONTROL_ENABLE = 0x00000001,
JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED = 0x00000002,
JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP = 0x00000004
}
/// <summary>
/// Launch the legacy application with some options set.
/// </summary>
static void DoExecuteProgramm()
{
// prepare the process to execute
var startInfo = new ProcessStartInfo();
. . . . .
// Start the process
var process = Process.Start(startInfo);
//Limit the CPU usage to 45%
var jobHandle = CreateJobObject(null, null);
AssignProcessToJobObject(jobHandle, process.Handle);
var cpuLimits = new JOBOBJECT_CPU_RATE_CONTROL_INFORMATION();
cpuLimits.ControlFlags = (UInt32)(CpuFlags.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | CpuFlags.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP);
cpuLimits.CpuRate = 45 * 100; // Limit CPu usage to 45%
var pointerToJobCpuLimits = Marshal.AllocHGlobal(Marshal.SizeOf(cpuLimits));
Marshal.StructureToPtr(cpuLimits, pointerToJobCpuLimits, false);
if (!SetInformationJobObject(jobHandle, JOBOBJECTINFOCLASS.JobObjectCpuRateControlInformation, pointerToJobCpuLimits, (uint)Marshal.SizeOf(cpuLimits)))
{
Console.WriteLine("Error !");
}
}
Nguồn
2015-07-11 19:46:26
Bạn có thể thay đổi ưu tiên của quá trình (Tôi nghĩ rằng nó thậm chí có thể là một lựa chọn trong 'ProcessStartInfo'). Nó không thực sự giới hạn bao nhiêu thời gian xử lý nó sẽ nhận được nhưng nó sẽ cho hệ điều hành để cho các quy trình khác được ưu tiên. –