首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用任务并行库(TPL)实现重试逻辑

如何用任务并行库(TPL)实现重试逻辑
EN

Stack Overflow用户
提问于 2011-05-22 18:54:52
回答 2查看 4.8K关注 0票数 11

可能重复:

Retry a task multiple times based on user input in case of an exception in task

我正在寻找一种在TPL中实现重试逻辑的方法。我希望有一个通用函数/类,它将能够返回一个任务,该任务将执行给定的操作,如果出现异常,将重新尝试该任务,直至给定的重试计数。我试着使用ContinueWith并让回调在异常情况下创建一个新任务,但它似乎只适用于固定数量的重试。有什么建议吗?

代码语言:javascript
运行
复制
    private static void Main()
    {
        Task<int> taskWithRetry = CreateTaskWithRetry(DoSometing, 10);
        taskWithRetry.Start();
        // ...

    }

    private static int DoSometing()
    {
        throw new NotImplementedException();
    }

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

    }
EN

回答 2

Stack Overflow用户

发布于 2011-05-22 18:59:34

有什么理由跟第三方物流有什么特别的关系吗?为什么不为Func<T>本身做一个包装呢?

代码语言:javascript
运行
复制
public static Func<T> Retry(Func<T> original, int retryCount)
{
    return () =>
    {
        while (true)
        {
            try
            {
                return original();
            }
            catch (Exception e)
            {
                if (retryCount == 0)
                {
                    throw;
                }
                // TODO: Logging
                retryCount--;
            }
        }
    };
}

请注意,您可能希望添加一个ShouldRetry(Exception)方法,以允许某些异常(例如取消)中止而不进行重试。

票数 9
EN

Stack Overflow用户

发布于 2011-05-22 19:10:25

代码语言:javascript
运行
复制
private static Task<T> CreateTaskWithRetry<T>(Func<T> action, int retryCount)
{
    Func<T> retryAction = () =>
    {
        int attemptNumber = 0;
        do
        {
            try
            {
                attemptNumber++;
                return action();
            }
            catch (Exception exception) // use your the exception that you need
            {
                // log error if needed
                if (attemptNumber == retryCount)
                    throw;
            }
        }
        while (attemptNumber < retryCount);

        return default(T);
    };

    return new Task<T>(retryAction);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6090026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档