public unsafe void FreeNativeOverlapped(NativeOverlapped *overlapped) { if (overlapped == null) { throw new ArgumentNullException(nameof(overlapped)); } Win32ThreadPoolNativeOverlapped *threadPoolOverlapped = Win32ThreadPoolNativeOverlapped.FromNativeOverlapped(overlapped); Win32ThreadPoolNativeOverlapped.OverlappedData data = GetOverlappedData(threadPoolOverlapped, this); if (!data._completed) { Interop.mincore.CancelThreadpoolIo(_threadPoolHandle); Release(); } data._boundHandle = null; data._completed = false; if (data._preAllocated != null) { data._preAllocated.Release(); } else { Win32ThreadPoolNativeOverlapped.Free(threadPoolOverlapped); } }
public static unsafe object GetNativeOverlappedState(NativeOverlapped *overlapped) { if (overlapped == null) { throw new ArgumentNullException(nameof(overlapped)); } Win32ThreadPoolNativeOverlapped *threadPoolOverlapped = Win32ThreadPoolNativeOverlapped.FromNativeOverlapped(overlapped); Win32ThreadPoolNativeOverlapped.OverlappedData data = GetOverlappedData(threadPoolOverlapped, null); return(threadPoolOverlapped->Data._state); }