كسول مهلة القرار قاطع الدائرة هو رمي argumentoutoutoutoutoutOutOfrangeEception

StackOverflow https://stackoverflow.com/questions/2043544

سؤال

ayende نشر تعديل إلى ديفي بريون قاطع دائرة, ، حيث غير القرار المهلة نموذج كسول.

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();
}

لكن، يمكن أن يفشل المنشئ لأن أ TimeSpan يمكن أن تفيض بسرعة القيمة القصوى ل DateTime. وبعد على سبيل المثال، عندما تكون مهلة قواطع الدائرة هي القيمة القصوى لعدة زمنية.

تم القبض على System.ArgumentoutOutOfrangeException.

الرسالة = "توفر القيمة المضافة أو المستحقة في تاريخ التمارين غير القابلة للتمثيل."

...

في system.datetime.op_addition (DateTime D، TimeSpan T)

كيف يمكننا تجنب هذه المشكلة والحفاظ على السلوك المتوقع؟

هل كانت مفيدة؟

المحلول

تفعل قليلا من الرياضيات

تحديد إذا المهلة أكبر من الباقي الحد الأقصى لقيمة DateTime والتيار الحالي DateTime. وبعد كحد أقصى TimeSpan يشير عادة مهلة لا حصر لها وظيفيا (مما يجعل هذه الكسارة الدائرة "لمرة واحدة").

public OpenState(CircuitBreaker outer)
    : base(outer)
{
    DateTime now = DateTime.UtcNow;
    expiry = outer.Timeout > (DateTime.MaxValue - now) 
        ? DateTime.MaxValue
        : now + outer.Timeout;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top