Heim >Backend-Entwicklung >C++ >Wie verwalte ich Jobobjekte in .NET mit Pinvoke?

Wie verwalte ich Jobobjekte in .NET mit Pinvoke?

DDD
DDDOriginal
2024-12-31 15:44:13288Durchsuche

How to Manage Job Objects in .NET Using Pinvoke?

Pinvoking von CreateJobObject/SetInformationJobObject in .NET

Definieren von Pinvoke-Methoden

Die folgenden Pinvoke-Methoden bieten Zugriff auf native Funktionen, die für die Jobobjektverwaltung erforderlich sind:

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

Job erstellen Objekt

Um ein Jobobjekt zu erstellen, verwenden Sie CreateJobObject:

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

Jobobjektinformationen festlegen

Um Informationen für das Jobobjekt festzulegen, verwenden Sie 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()));

Prozesse zu einem Jobobjekt hinzufügen

Um einen Prozess zum Jobobjekt hinzuzufügen, verwenden Sie AssignProcessToJobObject:

bool AddProcess(IntPtr processHandle) => AssignProcessToJobObject(handle, processHandle);
bool AddProcess(int processId) => AddProcess(Process.GetProcessById(processId).Handle);

Ein Jobobjekt entsorgen

Das Jobobjekt mithilfe der benutzerdefinierten „Disposible“-Implementierung entsorgen:

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

Durch die Verwendung dieser Implementierung können Sie effektiv Folgendes erstellen: Konfigurieren und verwalten Sie Jobobjekte in Ihren .NET-Anwendungen.

Das obige ist der detaillierte Inhalt vonWie verwalte ich Jobobjekte in .NET mit Pinvoke?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn