/// <summary>
 /// Constructor
 /// </summary>
 /// <param name="config">The configuration for the source breaker</param>
 /// <param name="reason">The reason why the breaker tried to open</param>
 /// <param name="exception">The source exception</param>
 /// <param name="toleratedOpenEventCount">How many open events have been tolerated</param>
 public ToleratedOpenCircuitBreakerEventArgs(CircuitBreakerConfig config, BreakerOpenReason reason,
     Exception exception, short toleratedOpenEventCount) : base(config)
 {
     Reason = reason;
     Exception = exception;
     ToleratedOpenEventCount = toleratedOpenEventCount;
 }
 private void OnOpenBreaker(BreakerOpenReason reason, Exception thrownException)
 {
     if (OpenedCircuitBreaker != null)
     {
         OpenedCircuitBreaker(this, new OpenedCircuitBreakerEventArgs(_config, reason, thrownException));
     }
 }
 private void OnToleratedOpenBreaker(int toleratedOpenEventCount, BreakerOpenReason reason, Exception thrownException)
 {
     if (ToleratedOpenCircuitBreaker != null)
     {
         ToleratedOpenCircuitBreaker(this,
             new ToleratedOpenCircuitBreakerEventArgs(_config, reason, thrownException, toleratedOpenEventCount));
     }
 }
 private void OpenBreaker(BreakerOpenReason reason, Exception thrownException = null)
 {
     if (State != BreakerState.Open)
     {
         if (State == BreakerState.HalfOpen)
         {
             SafeIncrementOpenPeriodIndex();
         }
         if (CanResetToleratedEventCount)
         {
             _toleratedOpenEventCount = 0;
             _firstToleratedEventTime = DateTime.MinValue;
         }
         if (State == BreakerState.HalfOpen || _toleratedOpenEventCount >= _config.OpenEventTolerance)
         {
             State = BreakerState.Open;
             _openedTime = DateTime.UtcNow;
             OnOpenBreaker(reason, thrownException);
             _toleratedOpenEventCount = 0;
         }
         else
         {
             OnToleratedOpenBreaker(_toleratedOpenEventCount++, reason, thrownException);
             if (_toleratedOpenEventCount == 1)
             {
                 _firstToleratedEventTime = DateTime.UtcNow;
             };
         }
     }
 }
 public void RaiseEvent(ICircuitBreakerDefinition breakerDefinition, BreakerOpenReason reason, Exception thrownException)
 {
     _connection.AppendToStreamAsync(StreamFormatter.GetStreamWithCategory("OpenedEvent", breakerDefinition.BreakerId),
         ExpectedVersion.Any, _credentials, breakerDefinition.AsJson());
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="config">Configuration for the source breaker</param>
 /// <param name="reason">The reason for opening</param>
 /// <param name="exception">The original exception</param>
 public OpenedCircuitBreakerEventArgs(CircuitBreakerConfig config, BreakerOpenReason reason, Exception exception) : base(config)
 {
     this.Reason = reason;
     Exception = exception;
 }