如何在.net 4.0中重试任务
本文关键字:重试 任务 net | 更新日期: 2023-09-27 18:04:30
对于前面的问题"在任务中出现异常的情况下根据用户输入多次重试任务"的公认答案提供了c# 5.0中的代码
我不熟悉。net async,使用。net 4.0的await结构很难将c# 4.0中的代码组合在一起。其他答案也包含谜题
你能给我提供一个完整的c# 4.0源代码,即样本,如何在c#中重试一个任务,包括处理异常和允许取消重试吗?
如果我正确理解了你的问题,你是在要求一个类似于这个问题中建议的解决方案。这里,Jon Skeet给出了一般操作的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--;
}
}
}
如果要引用Jon Skeet的答案与原始答案相结合,那么它应该指定:
private static Task<T> CreateTaskWithRetry<T>(Func<T> action, int retryCount)
代替:
public static Func<T> Retry(Func<T> original, int retryCount)