ホームページ >バックエンド開発 >C++ >Pinvoke を使用して .NET でジョブ オブジェクトを管理するにはどうすればよいですか?

Pinvoke を使用して .NET でジョブ オブジェクトを管理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-31 15:44:13304ブラウズ

How to Manage Job Objects in .NET Using Pinvoke?

.NET での CreateJobObject/SetInformationJobObject のピン呼び出し

Pinvoke メソッドの定義

次の Pinvoke メソッドは、ジョブ オブジェクトの管理に必要なネイティブ関数へのアクセスを提供します。

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

ジョブの作成オブジェクト

ジョブ オブジェクトを作成するには、CreateJobObject を使用します:

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

ジョブ オブジェクト情報の設定

ジョブ オブジェクトの情報を設定するには、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()));

ジョブ オブジェクトへのプロセスの追加

追加するにはジョブ オブジェクトにプロセスを追加するには、AssignProcessToJobObject を使用します:

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

ジョブ オブジェクトの破棄

カスタム Disposable 実装を使用してジョブ オブジェクトを破棄します:

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

を利用するこの実装により、.NET アプリケーションでジョブ オブジェクトを効果的に作成、構成、管理できます。

以上がPinvoke を使用して .NET でジョブ オブジェクトを管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。