如何在.NET 4.0中重试任务?

时间:2013-03-18 04:51:40

标签: c# .net c#-4.0 concurrency task-parallel-library

accepted answer to earlier问题“如果在任务中发生异常,则根据用户输入多次重试任务”提供了C#5.0中的代码

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

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

2 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,那么您需要的解决方案类似于this question中建议的解决方案。在这里,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)
}

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

编辑:其他人已经正确地指出我的代码可以在所考虑的情况下简化/专门化。上面的代码将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--;
        }
    }
}

答案 1 :(得分:-5)

好吧,如果要将Jon Skeet's answeroriginal answer结合使用,那么应该指定:

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

取代:

public static Func<T> Retry(Func<T> original, int retryCount)