Maison >développement back-end >C++ >Comment gérer les objets de travail dans .NET à l'aide de Pinvoke ?

Comment gérer les objets de travail dans .NET à l'aide de Pinvoke ?

DDD
DDDoriginal
2024-12-31 15:44:13288parcourir

How to Manage Job Objects in .NET Using Pinvoke?

Pinvoking CreateJobObject/SetInformationJobObject dans .NET

Définition des méthodes 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);

Créer un emploi Object

Pour créer un objet de travail, utilisez CreateJobObject :

var handle = CreateJobObject(IntPtr.Zero, null);

Définition des informations sur l'objet de travail

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()));

Ajout de processus à un objet de travail

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);

Suppression d'un objet de travail

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn