3
一時的なフォールト処理にPollyフレームワークを使用しています。同期動作の場合Polly回路遮断器のポリシーは正常に機能しますが、非同期バージョンを作成しても実行を再試行しません。親切に示唆:PollyフレームワークCircuitBreakerAsyncは、例外が発生した場合に再試行しません。
非同期メソッド:
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.");
}
ポリー回路ブレーカ非同期ポリシー:
AsyncDemo3(HelloWorldの:ポリー回路ブレーカポリシーを実行
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);
}
}
);
問題の発見と解決に役立ちます。
ポリーも今[PolicyWrap(https://github.com/App-vNext/Polly添加しました/ wiki/PolicyWrap)、ポリシーをより簡潔に組み合わせるための構文を作ることができます: 'retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(...)' –