private void CompleteWaiters(TSingleton singleton, Exception completeException)
        {
            Queue <SingletonManager <TSingleton> .AsyncWaiter> asyncWaiters;

            lock (this.syncRoot)
            {
                if (completeException != null)
                {
                    this.singletonState = SingletonManager <TSingleton> .SingletonState.NeedCreate;
                }
                else
                {
                    this.singletonState    = SingletonManager <TSingleton> .SingletonState.Created;
                    this.singletonInstance = singleton;
                }
                asyncWaiters = this.waiters;
                this.waiters = null;
            }
            if (asyncWaiters != null)
            {
                ExceptionInfo exceptionInfo = new ExceptionInfo(completeException);
                foreach (SingletonManager <TSingleton> .AsyncWaiter asyncWaiter in asyncWaiters)
                {
                    asyncWaiter.Signal(singleton, exceptionInfo.CreateException());
                }
            }
        }
            private bool ContinueOperation(Exception delayedException, IList <BatchManager <TItem> .BatchedObjectsAsyncResult> batchedObjectsAsyncResults)
            {
                if (delayedException != null)
                {
                    MessagingClientEtwProvider.TraceClient(() => MessagingClientEtwProvider.Provider.EventWriteBatchManagerException(this.TrackingContext.Activity, this.TrackingContext.TrackingId, this.TrackingContext.SystemTracker, "BatchManager.PerformFlushAsyncResult.ContinueOperation", delayedException.ToStringSlim()));
                }
                if (this.isInTransaction || delayedException == null || delayedException is CommunicationObjectFaultedException)
                {
                    ExceptionInfo exceptionInfo = new ExceptionInfo(delayedException);
                    foreach (BatchManager <TItem> .BatchedObjectsAsyncResult batchedObjectsAsyncResult in batchedObjectsAsyncResults)
                    {
                        IOThreadScheduler.ScheduleCallbackNoFlow((object s) => ((BatchManager <TItem> .BatchedObjectsAsyncResult)s).CompleteBatch(exceptionInfo.CreateException()), batchedObjectsAsyncResult);
                    }
                    return(false);
                }
                int  count = batchedObjectsAsyncResults.Count;
                bool flag  = count > 1;

                Interlocked.Add(ref this.batchedResultsCount, count);
                foreach (BatchManager <TItem> .BatchedObjectsAsyncResult batchedObjectsAsyncResult1 in batchedObjectsAsyncResults)
                {
                    if (!this.ShouldRetry(delayedException, batchedObjectsAsyncResult1, flag))
                    {
                        this.CompleteSingleOperation(batchedObjectsAsyncResult1, delayedException);
                    }
                    else
                    {
                        try
                        {
                            IAsyncResult batchedBegin = this.BatchManager.BatchedBegin(this.TrackingContext, batchedObjectsAsyncResult1.BatchedObjects, this.transactionId, this.timeout, BatchManager <TItem> .PerformFlushAsyncResult.singleOperationCompleteCallback, new Tuple <BatchManager <TItem> .PerformFlushAsyncResult, BatchManager <TItem> .BatchedObjectsAsyncResult>(this, batchedObjectsAsyncResult1));
                            if (batchedBegin.CompletedSynchronously)
                            {
                                this.OnSingleOperationCompleted(batchedBegin);
                            }
                        }
                        catch (Exception exception1)
                        {
                            Exception exception = exception1;
                            if (Fx.IsFatal(exception))
                            {
                                throw;
                            }
                            this.CompleteSingleOperation(batchedObjectsAsyncResult1, exception);
                        }
                    }
                }
                return(true);
            }