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