Heim > Backend-Entwicklung > C++ > Wie verwaltet man Prozesse und steuert Ressourcen mithilfe von CreateJobObject und SetInformationJobObject in .NET?

Wie verwaltet man Prozesse und steuert Ressourcen mithilfe von CreateJobObject und SetInformationJobObject in .NET?

Susan Sarandon
Freigeben: 2024-12-29 19:47:15
Original
509 Leute haben es durchsucht

How to Manage Processes and Control Resources Using CreateJobObject and SetInformationJobObject in .NET?

So verwenden Sie CreateJobObject und SetInformationJobObject mit P/Invoke in .NET

CreateJobObject und SetInformationJobObject sind Win32-Funktionen, mit denen Sie Jobobjekte bearbeiten können . Jobobjekte sind ein Mechanismus zur Verwaltung von Prozessgruppen und zur Steuerung ihrer Ressourcen. Sie können verwendet werden, um eine Vielzahl von Effekten zu erzeugen, z. B. um zu verhindern, dass Prozesse sich gegenseitig beenden, oder um ihren Zugriff auf Ressourcen einzuschränken.

Um CreateJobObject und SetInformationJobObject mit P/Invoke in .NET zu verwenden, müssen Sie eine Deklaration durchführen die folgenden Funktionen und Strukturen:

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

private IntPtr handle;
private bool disposed;
Nach dem Login kopieren

Die Funktion CreateJobObject erstellt ein neues Jobobjekt. Die SetInformationJobObject-Funktion legt Informationen für ein Jobobjekt fest. Die Funktion AssignProcessToJobObject weist einem Jobobjekt einen Prozess zu. Die CloseHandle-Funktion schließt ein Handle für ein Jobobjekt.

Das folgende Codebeispiel zeigt Ihnen, wie Sie diese Funktionen verwenden, um ein Jobobjekt zu erstellen, seine Informationen festzulegen und ihm einen Prozess zuzuweisen:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace JobManagement
{
    public class Job : IDisposable
    {
        public Job()
        {
            handle = CreateJobObject(IntPtr.Zero, null);

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

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

        public bool AddProcess(IntPtr processHandle)
        {
            return AssignProcessToJobObject(handle, processHandle);
        }

        public bool AddProcess(int processId)
        {
            return AddProcess(Process.GetProcessById(processId).Handle);
        }

    }

    #region Helper classes

    [StructLayout(LayoutKind.Sequential)]
    struct IO_COUNTERS
    {
        public UInt64 ReadOperationCount;
        public UInt64 WriteOperationCount;
        public UInt64 OtherOperationCount;
        public UInt64 ReadTransferCount;
        public UInt64 WriteTransferCount;
        public UInt64 OtherTransferCount;
    }


    [StructLayout(LayoutKind.Sequential)]
    struct JOBOBJECT_BASIC_LIMIT_INFORMATION
    {
        public Int64 PerProcessUserTimeLimit;
        public Int64 PerJobUserTimeLimit;
        public UInt32 LimitFlags;
        public UIntPtr MinimumWorkingSetSize;
        public UIntPtr MaximumWorkingSetSize;
        public UInt32 ActiveProcessLimit;
        public UIntPtr Affinity;
        public UInt32 PriorityClass;
        public UInt32 SchedulingClass;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SECURITY_ATTRIBUTES
    {
        public UInt32 nLength;
        public IntPtr lpSecurityDescriptor;
        public Int32 bInheritHandle;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION
    {
        public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
        public IO_COUNTERS IoInfo;
        public UIntPtr ProcessMemoryLimit;
        public UIntPtr JobMemoryLimit;
        public UIntPtr PeakProcessMemoryUsed;
        public UIntPtr PeakJobMemoryUsed;
    }

    public enum JobObjectInfoType
    {
        AssociateCompletionPortInformation = 7,
        BasicLimitInformation = 2,
        BasicUIRestrictions = 4,
        EndOfJobTimeInformation = 6,
        ExtendedLimitInformation = 9,
        SecurityLimitInformation = 5,
        GroupInformation = 11
    }

    #endregion

}
Nach dem Login kopieren

Dieses Codebeispiel erstellt ein Jobobjekt, legt seine Informationen fest, um zu verhindern, dass Prozesse sich gegenseitig beenden, und weist den aktuellen Prozess dem Jobobjekt zu.

Das obige ist der detaillierte Inhalt vonWie verwaltet man Prozesse und steuert Ressourcen mithilfe von CreateJobObject und SetInformationJobObject in .NET?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage