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