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); }