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?

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top