internal RegisteredWaitHandle (WaitHandle waitObject, WaitOrTimerCallback callback, object cbState, int timeout, bool executeOnlyOnce) { this.waitObject = waitObject; this.callback = callback; this.cbState = cbState; this.timeout = timeout; this.executeOnlyOnce = executeOnlyOnce; StWaitable waitable; if ((waitable = waitObject.waitable) == null) { /* * Either we're dealing with a disposed wait handle * or with some other derived class. */ UnparkCallback (StParkStatus.Inflated); return; } cbparker = new CbParker (UnparkCallback, false, true); int ignored = 0; waitBlock = waitable._WaitAnyPrologue (cbparker, StParkStatus.Success, ref hint, ref ignored); state = ACTIVE; int ws = cbparker.EnableCallback (timeout); if (ws != StParkStatus.Pending) { UnparkCallback (ws); } }
internal CancellationTokenRegistration RegisterInternal (Action<Object> callback, object cbState, bool useSynchronizationContext, bool useExecutionContext) { if (!CanBeCanceled) { return new CancellationTokenRegistration (); } var cbParker = new CbParker (_ => callback (cbState), useSynchronizationContext, useExecutionContext); if (RegisterParker (cbParker) && cbParker.EnableCallback (Timeout.Infinite) == StParkStatus.Pending) { return new CancellationTokenRegistration (cbParker, this); } callback (cbState); return new CancellationTokenRegistration (); }