gpt4 book ai didi

c# - 如何在使用 RateGate 时更改速率限制?

转载 作者:行者123 更新时间:2023-11-30 22:12:40 25 4
gpt4 key购买 nike

我使用的是简洁的RateGate class限制我发送到服务器的请求数量。

我的代码看起来像这样:

var RateLimit = 35;

using(var RateGate = new RateGate(RateLimit, TimeSpan.FromSeconds(1)))
{
for(var Run = 1; Run <= 50; Run++)
{
for(var Batch = 0; Batch < 200; Batch++)
{
// Do some work, then...

MyClass MyClass;

if(MyClass.RateLimitHit)
{
RateLimit--;
}

RateGate.WaitToProceed();
}
}
}

if(MyClass.RateLimitHit)里面,我需要将速率限制降低 1。不仅仅是变量 RateLimit , 但在实际中运行的限制 RateGate .

在 RateGate 类中,我看到了这个:

/// <summary>
/// Number of occurrences allowed per unit of time.
/// </summary>
public int Occurrences { get; private set; }

我的问题是:如果我改变 private set;set;并添加 RateGate.Occurrences = RateLimit;RateLimit--; 之后这会如我所愿吗?

我试过了,但它看起来像 RateGate继续以 35/s 的最大速率执行。

最佳答案

我也想这样做,我通过倒置时间和事件找到了一个很好的解决方案。这是什么意思:

我没有将我的问题表达为“我希望每秒出现 N 次”,而是将其倒置为“我希望每 1/N 秒出现 1 次”。这样,我就可以轻松更改时间单位,而不是修改出现次数(始终为 1)。我将此方法添加到类中(您也可以派生):

private object _updateTimeUnitLock = new object();
private int nextUpdateTime = 0;
public bool UpdateTimeUnit(TimeSpan timeUnit, TimeSpan dontUpdateBefore)
{
lock (_updateTimeUnitLock)
{
if ((nextUpdateTime == 0) || (nextUpdateTime <= Environment.TickCount))
{
TimeUnitMilliseconds = (int)timeUnit.TotalMilliseconds;
nextUpdateTime = Environment.TickCount + (int)dontUpdateBefore.TotalMilliseconds;

return true;
}

return false;
}
}

我的必须是线程安全的,我需要一种方法来防止在某些时期发生变化,所以在你这边你可能想要删除锁和 dontUpdateBefore 参数,这意味着你可以设置 TimeUnitMilliseconds 和该值将在下一个计时器滴答时被拾取。现在,要调用它,您只需要根据您想要的出现次数计算您想要的新时间。

希望它能满足您的需求。

更新 3/12/22:RateGate 类的原始链接已损坏,但我在 Github 上找到了该类的副本.

关于c# - 如何在使用 RateGate 时更改速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19579935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com