问题标签 [rategate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何在不冒应用失败风险的情况下调用 SemaphoreSlim.Release()?
我正在尝试使用SemaphoreSlim
.NET 4.0 中的新类来限制可以无限期运行的快节奏循环。在对此进行单元测试时,我发现如果循环足够紧密并且并行度足够高,则SemaphoreSlim
在调用时会抛出无法捕获的异常Release()
,即使您首先检查.Count
属性并在期间锁定信号量实例本身整个检查计数/释放序列。
此异常会关闭应用程序,期间。据我所知,没有抓住它。
深入挖掘,我发现在调用期间SemaphoreSlim
试图在.AvailableWaitHandle
内部访问它自己的属性Release()
,它在那里抛出异常,而不是我访问SemaphoreSlim
实例本身。(我必须使用 Debug->Exceptions->Common Language Runtime Exceptions->Thrown all check in Visual Studio 进行调试以发现这一点;您无法在运行时捕获它。有关更多详细信息,请参阅The Uncatchable Exception。)
我的问题是,有没有人知道在这种情况下使用此类而不冒立即终止应用程序的风险的防弹方法?
注意:信号量实例被包装在一个 RateGate 实例中,其代码可以在这篇文章中找到:Better Rate Limiting in .NET。
更新:我正在添加完整的控制台应用程序代码来重现。两个答案都有助于解决方案;请参阅下面的说明。
因此,使用@dtb 的解决方案,线程“a”仍然有可能通过_isDisposed
检查,但线程“b”在线程“a”命中之前处理信号量Release()
。我发现在 ExitTimerCallback 和 Dispose 方法中都在 _semaphore 实例周围添加了一个锁。@Peter Ritchie 的建议使我在处理信号量之前另外取消并处理了计时器。这两件事的结合使程序可以无一例外地正确完成和处理 RateGate。
由于没有该输入我不会得到这个,我不想回答自己。但是由于 StackOverflow 在有完整答案时更有用,所以我会接受任何人首先发布成功在上面的控制台应用程序中存活的补丁或伪补丁。
c# - 如何在使用 RateGate 时更改速率限制?
我正在使用简洁的RateGate 类来限制我发送到服务器的请求数。
我的代码看起来像这样:
在内部if(MyClass.RateLimitHit)
,我需要将速率限制降低 1。不仅仅是变量RateLimit
,还有实际运行的限制RateGate
。
在 RateGate 类中,我看到了这个:
我的问题是:如果我更改private set;
为set;
并添加RateGate.Occurrences = RateLimit;
之后RateLimit--;
,这会做我想要的吗?
我试过了,但它看起来RateGate
继续以 35/s 的最大速率执行。