如何在.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#中重试一个任务,包括处理异常和允许取消重试吗?

如何在.net 4.0中重试任务

如果我正确理解了你的问题,你是在要求一个类似于这个问题中建议的解决方案。这里,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)