private static void TimerCallback(IntPtr instance, IntPtr context, IntPtr timer) { int id = (int)context; var wrapper = ThreadPoolCallbackWrapper.Enter(); Instances[id].FireNextTimers(); ThreadPool.IncrementCompletedWorkItemCount(); wrapper.Exit(); }
internal static void RegisteredWaitCallback(IntPtr instance, IntPtr context, IntPtr wait, uint waitResult) { var wrapper = ThreadPoolCallbackWrapper.Enter(); GCHandle handle = (GCHandle)context; RegisteredWaitHandle registeredWaitHandle = (RegisteredWaitHandle)handle.Target; Debug.Assert((handle == registeredWaitHandle._gcHandle) && (wait == registeredWaitHandle._tpWait)); bool timedOut = (waitResult == (uint)Interop.Kernel32.WAIT_TIMEOUT); registeredWaitHandle.PerformCallback(timedOut); ThreadPool.IncrementCompletedWorkItemCount(); wrapper.Exit(); }
private static unsafe void OnNativeIOCompleted(IntPtr instance, IntPtr context, IntPtr overlappedPtr, uint ioResult, UIntPtr numberOfBytesTransferred, IntPtr ioPtr) { var wrapper = ThreadPoolCallbackWrapper.Enter(); Win32ThreadPoolNativeOverlapped *overlapped = (Win32ThreadPoolNativeOverlapped *)overlappedPtr; ThreadPoolBoundHandle boundHandle = overlapped->Data._boundHandle; if (boundHandle == null) { throw new InvalidOperationException(SR.Argument_NativeOverlappedAlreadyFree); } boundHandle.Release(); Win32ThreadPoolNativeOverlapped.CompleteWithCallback(ioResult, (uint)numberOfBytesTransferred, overlapped); ThreadPool.IncrementCompletedWorkItemCount(); wrapper.Exit(); }