accepted answer to earlier问题“如果在任务中发生异常,则根据用户输入多次重试任务”提供了C#5.0中的代码
我不熟悉.NET异步,等待使用.NET 4.0的构造很难将代码放在C#4.0中。其他答案也包含谜题
您能否向我提供完整的C#4.0源代码,即示例,如何在C#中重试任务,包括处理异常并允许取消而不重试?
答案 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 answer与original answer结合使用,那么应该指定:
private static Task<T> CreateTaskWithRetry<T>(Func<T> action, int retryCount)
取代:
public static Func<T> Retry(Func<T> original, int retryCount)