private void TokenProcess()
        {
            int sleep = 1000 / MaxQPS;

            if (sleep == 0)
            {
                sleep = 1;
            }
            sleep += 1;//不能卡那么准
            DateTime start = DateTime.Now;

            while (cancellationToken.Token.IsCancellationRequested == false)
            {
                lock (lockObject)
                {
                    if (limitedQueue.Count > 0)
                    {
                        var request = limitedQueue.Dequeue();
                        request.HasHandle = true;
                    }
                }

                if (DateTime.Now - start < TimeSpan.FromMilliseconds(sleep))
                {
                    int newSleep = sleep - (int)(DateTime.Now - start).TotalMilliseconds;
                    if (newSleep >= 0)
                    {
                        Thread.Sleep(newSleep);
                    }
                }
                start = DateTime.Now;
            }
        }
Exemplo n.º 2
0
 public bool RequestWithRetry(int retryCount)
 {
     if (retryCount < 0)
     {
         return(false);
     }
     while (retryCount != 0)
     {
         if (limitedQueue.Count > 0)
         {
             lock (lockObject)
             {
                 if (limitedQueue.Count > 0) // 若是加锁一瞬间没令牌了也不行
                 {
                     object token = limitedQueue.Dequeue();
                     if (token != null)
                     {
                         return(true);
                     }
                 }
             }
         }
         if (limitedQueue.Count == 1)
         {
             Thread.Sleep(1000 / MaxQPS - 1);
         }
         else
         {
             Thread.Sleep(System.Math.Max(0, (limitedQueue.Count - 1) * 1000 / MaxQPS));
         }
         retryCount--;
     }
     return(false);
 }