Files
Web_CRICS_Server_VS2010_Prod/Common/RateLimiter.cs

52 lines
1.6 KiB
C#
Raw Normal View History

2025-12-11 09:17:16 +08:00
using System;
using System.Collections.Generic;
using System.Threading;
namespace Common
{
public class RateLimiter
{
private static readonly object lockObject = new object();
private static readonly int requestsPerSecond = 5;//每秒允许请求5次
private static int remainingRequests;//剩余请求次数
private static long lastRequestTime;//上次请求时间
/// <summary>
/// 实现速率限制。它根据指定的每秒请求数量来控制请求是否被允许
/// </summary>
static RateLimiter()
{
remainingRequests = requestsPerSecond;
lastRequestTime = DateTime.UtcNow.Ticks;
}
/// <summary>
/// 实现速率限制默认每秒允许请求5次
/// </summary>
/// <returns></returns>
public static bool TryRequest()
{
lock (lockObject)
{
long currentTime = DateTime.UtcNow.Ticks;//当前请求时间
long elapsedTicks = currentTime - lastRequestTime;
double elapsedSeconds = elapsedTicks / TimeSpan.TicksPerSecond;
remainingRequests += (int)(elapsedSeconds * requestsPerSecond);
if (remainingRequests > requestsPerSecond)
{
remainingRequests = requestsPerSecond;
}
if (remainingRequests > 0)
{
remainingRequests--;
lastRequestTime = currentTime;
return true;
}
return false;
}
}
}
}