示例#1
0
        public RequestInstance GetInstanceToExecute(RequestInstance requestInstance)
        {
            ThreadCounts availableCounts = _threading.GetAvailableThreads();
            ThreadCounts activeCounts    = _maxThreads.Subtract(availableCounts);
            int          active          = activeCounts.Greatest();

            if (_count == 0 && active < _activeThreadsBeforeRemoteRequestsQueue)
            {
                return(requestInstance);
            }

            bool isLocal = requestInstance.IsLocal;

            if (_count >= _queueLengthBeforeIncomingRequestsRejected)
            {
                requestInstance.Reject();
                return(null);
            }

            requestInstance.Defer();
            QueueInstance(requestInstance, isLocal);
            if (active < _activeThreadsBeforeRemoteRequestsQueue)
            {
                return(DequeueInstance(false));
            }

            if (active < _activeThreadsBeforeLocalRequestsQueue)
            {
                return(DequeueInstance(true));
            }

            ScheduleExecuteIfNeeded();
            return(null);
        }