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
Libérer: 2024-12-31 15:44:13
original
343 Les gens l'ont consulté

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);
Copier après la connexion

Créer un emploi Object

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

var handle = CreateJobObject(IntPtr.Zero, null);
Copier après la connexion

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()));
Copier après la connexion

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);
Copier après la connexion

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;
}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal