我不認爲在這裏使用Rx很有意義,除非您可以像Enigmativity在評論中建議的那樣將您的方法重寫爲類似public IObservable<int> Add(IObservable<Tuple<int, int>> values)
的東西。
我會做的是將速率限制的關注區分爲單獨的類。這樣一來,你的代碼可能是這個樣子:
public class RateLimitingCalculator
{
private RateLimiter rateLimiter = new RateLimiter(5, TimeSpan.FromSeconds(1));
public async Task<int> Add(int a, int b)
{
rateLimiter.ThrowIfRateExceeded();
//...
}
}
的RateLimiter
實現取決於您的具體要求,但很簡單,不是線程安全版本看起來是這樣的:
class RateLimiter
{
private readonly int rate;
private readonly TimeSpan perTime;
private DateTime secondStart = DateTime.MinValue;
private int count = 0;
public RateLimiter(int rate, TimeSpan perTime)
{
this.rate = rate;
this.perTime = perTime;
}
public void ThrowIfRateExceeded()
{
var now = DateTime.UtcNow;
if (now - secondStart > perTime)
{
secondStart = now;
count = 1;
return;
}
if (count >= rate)
throw new RateLimitExceededException();
count++;
}
}
[這篇文章](http://stackoverflow.com/a/36933908/3407841)有一些想法可以幫助你。 – leetibbett
你應該真的避免混合單子。我認爲如果你有這樣的簽名,推理出來會容易一些:'public IObservable Add(IObservable values)'。 –
Enigmativity
@Enigmativity你是什麼意思與「避免混合monads」?另外,你認爲使用Rx來限制API是有意義的嗎? – SuperJMN