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; } }
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); }