/// <summary>
        ///
        /// </summary>
        /// <param name="methodInfo"></param>
        public QueueWaitResult AddToWaitInvoke(QueueMethodInfo methodInfo)
        {
            lock (Locker)
            {
                RemoveWaitTimeoutItems();

                if (IsLimitExpired)
                {
                    return(QueueWaitResult.LimitExpired());
                }

                methodInfo.WaitInvokeBeginDateTime = DateTime.Now;
                QueueMethodInfos.Add(methodInfo);
                return(new QueueWaitResult());
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T Invoke <T>(QueueMethodInfo methodInfo)
        {
            lock (Locker)
            {
                RemoveWaitBeforeInvoke();

                if (IsLimitExpired)
                {
                    methodInfo.State = QueueState.LimitExpired;
                }

                methodInfo.Owner = this;
                QueueMethodInfos.Add(methodInfo);
                CheckAndRun();
            }

            return(methodInfo.Invoke <T>());
        }