Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
                }
            }
        }