private void SetCompletionPort(SafeFileHandle completionPortHandle) { int length = Marshal.SizeOf(typeof(NativeMethods.JobObjectAssociateCompletionPort)); IntPtr completionPortPtr = IntPtr.Zero; try { var completionPort = new NativeMethods.JobObjectAssociateCompletionPort { CompletionKey = IntPtr.Zero, CompletionPortHandle = completionPortHandle.DangerousGetHandle(), }; completionPortPtr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(completionPort, completionPortPtr, false); if (!NativeMethods.SetInformationJobObject(handle, NativeMethods.JobObjectInfoClass.AssociateCompletionPortInformation, completionPortPtr, length)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } } finally { if (completionPortPtr != IntPtr.Zero) { Marshal.FreeHGlobal(completionPortPtr); } } }
public void SetCompletionPort() { int length = Marshal.SizeOf(typeof(NativeMethods.JobObjectAssociateCompletionPort)); IntPtr completionPortPtr = IntPtr.Zero; try { var nativeCompletionPort = NativeMethods.CreateIoCompletionPort(new IntPtr(-1), IntPtr.Zero, 0, 0); completionPort = new SafeFileHandle(nativeCompletionPort, true); var cp = new NativeMethods.JobObjectAssociateCompletionPort { CompletionKey = IntPtr.Zero, CompletionPortHandle = completionPort.DangerousGetHandle(), }; completionPortPtr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(cp, completionPortPtr, false); if ( !NativeMethods.SetInformationJobObject(handle, NativeMethods.JobObjectInfoClass.AssociateCompletionPortInformation, completionPortPtr, length)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } } catch (Win32Exception) { completionPort = null; } finally { if (completionPortPtr != IntPtr.Zero) { Marshal.FreeHGlobal(completionPortPtr); } } }