私があなたの質問を正しく理解した場合、あなたはこの質問で提案されたものと同様の解決策を求めています。ここでは、JonSkeetが一般的なアクションのRetryメソッドの実装を示しています。さらに、再試行せずに操作をキャンセルする可能性を処理する実行を含めるように求めています。その文脈で、Jonは、再試行するのが賢明かどうかを判断するために使用できる、ShouldRetry(Exception)メソッドを組み込む可能性についても言及しています。したがって、Jonによる元のコードにいくつかのサンプルコードを組み込みました。
public static Func<T> Retry(Func<T> original, int retryCount)
{
return () =>
{
while (true)
{
try
{
return original();
}
catch (Exception e)
{
if (retryCount == 0 || !ShouldRetry(e))
{
throw;
}
// TODO: Logging
retryCount--;
}
}
};
}
public static bool ShouldRetry(Exception e) {
return (e is MySpecialExceptionThatAllowsForARetry)
}
それは他の質問への答えを明確にしますか?
編集:他の人は、私のコードが考慮されたケースで単純化/特殊化される可能性があることを正しく指摘しています。上記のコードは、を再試行可能(または再試行)にラップFunc
します。質問に合うより単純な形式は次のようになりますFunc
public static T Retry(Task<T> original, int retryCount)
{
while (true)
{
try
{
return original();
}
catch (Exception e)
{
if (retryCount == 0 || !ShouldRetry(e))
{
throw;
}
// TODO: Logging
retryCount--;
}
}
}