Esempio n. 1
0
		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);
	      }
		}
Esempio n. 2
0
		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 ();
      }