Maison >développement back-end >C++ >Comment gérer les objets de travail dans .NET à l'aide de Pinvoke ?
Les méthodes Pinvoke suivantes donnent accès aux fonctions natives requises pour la gestion des objets de travail :
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] static extern IntPtr CreateJobObject(IntPtr a, string lpName); [DllImport("kernel32.dll")] static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); [DllImport("kernel32.dll", SetLastError = true)] static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject);
Pour créer un objet de travail, utilisez CreateJobObject :
var handle = CreateJobObject(IntPtr.Zero, null);
Pour définir les informations de l'objet de travail, utilisez SetInformationJobObject :
var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = 0x2000 }; var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length)) throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
Pour ajouter un processus à l'objet de travail, utilisez AssignProcessToJobObject :
bool AddProcess(IntPtr processHandle) => AssignProcessToJobObject(handle, processHandle); bool AddProcess(int processId) => AddProcess(Process.GetProcessById(processId).Handle);
Supprimez l'objet de travail à l'aide de l'implémentation jetable personnalisée :
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposed) return; if (disposing) { } Close(); disposed = true; } public void Close() { CloseHandle(handle); handle = IntPtr.Zero; }
En utilisant cette implémentation, vous pouvez créer efficacement, configurez et gérez les objets de travail dans vos applications .NET.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!