résolution de temporisation Lazy disjoncteur est de lancer ArgumentOutOfRangeException
-
19-09-2019 - |
Question
une modification de Davy Brion , où il changé la résolution de délai d'attente à un modèle paresseux.
private readonly DateTime expiry;
public OpenState(CircuitBreaker outer)
: base(outer)
{
expiry = DateTime.UtcNow + outer.timeout;
}
public override void ProtectedCodeIsAboutToBeCalled()
{
if(DateTime.UtcNow < expiry)
throw new OpenCircuitException();
outer.MoveToHalfOpenState();
}
Cependant, le constructeur peut échouer parce que TimeSpan
peut déborder rapidement la valeur maximale d'un DateTime
. Par exemple, lorsque le délai d'attente du disjoncteur est la valeur maximale d'un TimeSpan.
System.ArgumentOutOfRangeException a été pris
message = "La valeur ajoutée ou soustraite des résultats dans un DateTime de non-représentable".
...
à System.DateTime.op_Addition (DateTime d, TimeSpan t)
Comment pouvons-nous éviter ce problème et de maintenir le comportement attendu?
La solution
faire un peu de mathématiques
Déterminer si le délai d'attente est supérieure à celle du reste de la valeur maximale d'un DateTime
et le DateTime
courant. Une TimeSpan
maximale indique généralement un délai d'attente infini fonctionnellement (ce qui en fait un « unique » disjoncteur).
public OpenState(CircuitBreaker outer)
: base(outer)
{
DateTime now = DateTime.UtcNow;
expiry = outer.Timeout > (DateTime.MaxValue - now)
? DateTime.MaxValue
: now + outer.Timeout;
}