2016-04-04 7 views
3

Ich verwende Polly-Framework für transiente Fehlerbehandlung. Bei synchronen Operationen funktioniert die Policy-Leistungsschalterrichtlinie einwandfrei, aber wenn ich ihre asynchrone Version erstellt habe, wird die Ausführung nicht wiederholt. Freundlicherweise vorschlagen:Polly Framework CircuitBreakerAsync wiederholt nicht, wenn Ausnahme auftritt

Asynchronous Methode:

private async static Task HelloWorld() 
    { 
     if (DateTime.Now < programStartTime.AddSeconds(10)) 
     { 
      Console.WriteLine("Task Failed."); 
      throw new TimeoutException(); 
     } 
     await Task.Delay(TimeSpan.FromSeconds(1)); 
     Console.WriteLine("Task Completed."); 
    } 

Polly Leistungsschalter async: Eine

private static void AsyncDemo3(Func<Task> action) 
    { 
     programStartTime = DateTime.Now; 

     Policy policy = Policy 
      .Handle<TimeoutException>() 
      .CircuitBreakerAsync(3, TimeSpan.FromSeconds(2)); 
     try 
     { 
      var a = policy.ExecuteAndCaptureAsync(action, true).GetAwaiter().GetResult(); 
     } 
     catch (AggregateException ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception: " + ex.Message); 
     } 
    } 

den Leistungsschalter Politik Polly Executing:

AsyncDemo3 (Hello World);

Bitte helfen Sie, das Problem zu finden und zu lösen.

Antwort

7

Ich glaube, Sie missverstanden, was die Leistungsschalter Politik tut.

Was es ist, dass wenn Sie rufen Sie die angegebene Anzahl von Mal und es jedes Mal fehlschlägt, dann wird es aufhören, die angegebene Methode für eine bestimmte Zeit zu nennen. Aber es wiederholt sich nicht von selbst.

Um das zu tun, was Sie tun möchten, müssen Sie die Wiederholungsrichtlinie mit der Leistungsschalterrichtlinie kombinieren. Eine Möglichkeit, das zu tun wäre:

Policy retryPolicy = Policy.Handle<TimeoutException>().RetryAsync(3); 

Policy circuitBreakerPolicy = Policy 
    .Handle<TimeoutException>() 
    .CircuitBreakerAsync(3, TimeSpan.FromSeconds(2)); 

try 
{ 
    retryPolicy.ExecuteAsync(() => circuitBreakerPolicy.ExecuteAsync(action, true)) 
     .GetAwaiter().GetResult(); 
} 
… 

Der Ausgang dieses Codes ist:

Task Failed. 
Task Failed. 
Task Failed. 
Exception: The circuit is now open and is not allowing calls. 
+0

Polly hat auch jetzt hat [PolicyWrap] (https://github.com/App-vNext/Polly/wiki/PolicyWrap), die die Syntax für das Kombinieren von Richtlinien noch prägnanter machen kann: 'retryPolicy.WrapAsync (circuitBreakerPolicy) .ExecuteAsync (...)' –

Verwandte Themen