-4

以前の質問「タスクで例外が発生した場合にユーザー入力に基づいてタスクを複数回再試行する」 に対する受け入れられた回答は、C# 5.0 のコードを提供します。

私は、C# 4.0 でコードをまとめるのが困難な .NET 4.0 を使用する .NET async, await コンストラクトに慣れていません。他の答えにもパズルが含まれています

C# 4.0 の完全なソース コード、つまり、例外の処理や再試行なしでのキャンセルの許可など、C# でタスクを再試行する方法のサンプルを提供していただけますか?

4

2 に答える 2

2

私があなたの質問を正しく理解した場合、あなたはこの質問で提案されたものと同様の解決策を求めています。ここでは、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--;
        }
    }
}
于 2013-03-18T05:10:13.700 に答える
-5

さて、元の回答と組み合わせてジョンスキートの回答を参照する場合は、次のように指定する必要があります。

private static Task<T> CreateTaskWithRetry<T>(Func<T> action, int retryCount)

代わりに:

public static Func<T> Retry(Func<T> original, int retryCount)
于 2013-03-18T08:36:37.307 に答える