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

Wie verwalte ich Jobobjekte in .NET mit Pinvoke?

DDD
Freigeben: 2024-12-31 15:44:13
Original
296 Leute haben es durchsucht

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);
Nach dem Login kopieren

Job erstellen Objekt

Um ein Jobobjekt zu erstellen, verwenden Sie CreateJobObject:

var handle = CreateJobObject(IntPtr.Zero, null);
Nach dem Login kopieren

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()));
Nach dem Login kopieren

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);
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage