先前问题“在任务中出现异常时根据用户输入多次重试任务” 的公认答案提供了 C# 5.0 中的代码
我不熟悉 .NET 异步,使用 .NET 4.0 的 await 构造很难将 C# 4.0 中的代码放在一起。其他答案也包含谜题
您能否提供一个完整的 C# 4.0 源代码,即示例,如何在 C# 中重试任务,包括处理异常并允许取消而不重试?
先前问题“在任务中出现异常时根据用户输入多次重试任务” 的公认答案提供了 C# 5.0 中的代码
我不熟悉 .NET 异步,使用 .NET 4.0 的 await 构造很难将 C# 4.0 中的代码放在一起。其他答案也包含谜题
您能否提供一个完整的 C# 4.0 源代码,即示例,如何在 C# 中重试任务,包括处理异常并允许取消而不重试?
如果我正确理解了您的问题,则您要求的解决方案类似于此问题中建议的解决方案。在这里,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(或者更确切地说是retrying)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--;
}
}
}
好吧,如果将Jon Skeet 的答案与原始答案一起引用,那么它应该指定:
private static Task<T> CreateTaskWithRetry<T>(Func<T> action, int retryCount)
代替:
public static Func<T> Retry(Func<T> original, int retryCount)