private PdnSynchronizationContext(SynchronizationContext prevSyncContext, WaitForMultipleObjectsExDelegate waitForMultipleObjectsExCallback, SleepExDelegate sleepExCallback) { Validate.Begin().IsNotNull <SynchronizationContext>(prevSyncContext, "prevSyncContext").IsNotNull <WaitForMultipleObjectsExDelegate>(waitForMultipleObjectsExCallback, "waitForMultipleObjectsExCallback").IsNotNull <SleepExDelegate>(sleepExCallback, "sleepExCallback").Check(); this.syncThread = Thread.CurrentThread; this.prevSyncContext = prevSyncContext; this.waitForMultipleObjectsExCallback = waitForMultipleObjectsExCallback; this.sleepExCallback = sleepExCallback; this.processQueueCallback = new SendOrPostCallback(this.ProcessQueueCallback); this.processCollatedCallbackCallback = new SendOrPostCallback(this.ProcessCollatedCallback); base.SetWaitNotificationRequired(); }
public static PdnSynchronizationContextController Install(WaitForMultipleObjectsExDelegate waitForMultipleObjectsExCallback, SleepExDelegate sleepExCallback) { SynchronizationContext current = SynchronizationContext.Current; if (current == null) { ExceptionUtil.ThrowInvalidOperationException("An SynchronizationContext must already be installed before PdnSynchronizationContext may be installed"); } PdnSynchronizationContext context = new PdnSynchronizationContext(current, waitForMultipleObjectsExCallback, sleepExCallback); if (Interlocked.CompareExchange <PdnSynchronizationContext>(ref instance, context, null) != null) { ExceptionUtil.ThrowInvalidOperationException("Install() may only be called once"); } SynchronizationContext.SetSynchronizationContext(context); context.isInstalled = true; return(new PdnSynchronizationContextController(context)); }