public override void OnNext(T value) { if (cancelationToken.IsDisposed) { return; } Queue <T> targetQueue = null; lock (gate) { if (!readyDrainEnumerator) { readyDrainEnumerator = true; runningEnumeratorCount++; targetQueue = currentQueueReference = pool.Get(); targetQueue.Enqueue(value); } else { if (currentQueueReference != null) // null - if doesn't start OnNext and start OnCompleted { currentQueueReference.Enqueue(value); } return; } } switch (parent.frameCountType) { case FrameCountType.Update: MainThreadDispatcher.StartUpdateMicroCoroutine(DrainQueue(targetQueue, parent.frameCount)); break; case FrameCountType.FixedUpdate: MainThreadDispatcher.StartFixedUpdateMicroCoroutine(DrainQueue(targetQueue, parent.frameCount)); break; case FrameCountType.EndOfFrame: MainThreadDispatcher.StartEndOfFrameMicroCoroutine(DrainQueue(targetQueue, parent.frameCount)); break; default: throw new ArgumentException("Invalid FrameCountType:" + parent.frameCountType); } }
internal static PooledQueue <T> Make() { return(new PooledQueue <T>(QueuePool.Get())); }