-4

先前问题“在任务中出现异常时根据用户输入多次重试任务” 的公认答案提供了 C# 5.0 中的代码

我不熟悉 .NET 异步,使用 .NET 4.0 的 await 构造很难将 C# 4.0 中的代码放在一起。其他答案也包含谜题

您能否提供一个完整的 C# 4.0 源代码,即示例,如何在 C# 中重试任务,包括处理异常并允许取消而不重试?

4

2 回答 2

2

如果我正确理解了您的问题,则您要求的解决方案类似于此问题中建议的解决方案。在这里,Jon Skeet 给出了用于一般操作的 Retry 方法的实现。此外,您要求包含 execption 处理可以取消操作而不重试的可能性。在这种情况下,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)
}

这是否澄清了另一个问题的答案?

编辑:其他人已经正确地指出我的代码可以在考虑的情况下被简化/专门化。上面的代码将 a 包装Func成一个retriable(或者更确切地说是retryingFunc。适合问题的更简单的形式是

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

好吧,如果将Jon Skeet 的答案原始答案一起引用,那么它应该指定:

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 回答