重试之前的任务操作 TPL

2023-12-02

我想实现一个重试任务,该任务采用先前失败的任务操作并重复它。

这是我到目前为止所拥有的。然而,它只是重复任务出错的事实,而不是再次实际触发任务的操作。

public static async Task<T> Retry<T>(this Task<T> task, int retryCount, int delay, TaskCompletionSource<T> tcs = null)
{
    if (tcs == null)
    {
        tcs = new TaskCompletionSource<T>();
    }

    await task.ContinueWith(async _original =>
    {
        if (_original.IsFaulted)
        {
            if (retryCount == 0)
            {
                tcs.SetException(_original.Exception.InnerExceptions);
            }
            else
            {
                Console.WriteLine("Unhandled exception. Retrying...");

                await Task.Delay(delay).ContinueWith(async t =>
                {
                    await Retry(task, retryCount - 1, delay, tcs);
                });
            }
        }
        else
            tcs.SetResult(_original.Result);
    });
    return await tcs.Task;
}

我试图通过一点反思来采取行动。然而,似乎一旦任务完成,操作就会设置为空。

var action = task
    .GetType()
    .GetField("m_action", BindingFlags.NonPublic | BindingFlags.Instance)
    .GetValue(task) as Action;

理想情况下,我希望我的实现如下所示:

try
{
    await MakeFailure().Retry(5, 1000);
}
catch (Exception ex)
{
    Console.WriteLine("I had an exception");
}

这可能不可能,但我想在将代码重构为Retry(Func<T> task)


并不完全反对。但它将代码流程更改为我不喜欢的故障优先布局

考虑一下你的类型。Task代表异步操作。在异步世界中,Task代表异步操作已经开始了. Task不是你可以“重试”的事情。

另一方面,Func<Task>表示可以启动的异步操作。或者重新启动。这就是你需要处理的。

一旦使用了适当的类型,代码就很简单:

public static async Task<T> Retry<T>(Func<Task<T>> action, int retryCount, int delay)
{
  while (retryCount > 0)
  {
    try
    {
      return await action().ConfigureAwait(false);
    }
    catch (Exception ex)
    {
      await Task.Delay(delay).ConfigureAwait(false);
      --retryCount;
    }
  }
  return await action().ConfigureAwait(false);
}

与其他回答者一样,我建议您使用实际上为此设计的库。这瞬态故障处理应用程序块 and Polly这是两个很好的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重试之前的任务操作 TPL 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • OnInvitationReceivedListener 无法可靠地触发(如果有的话) - Google Play 游戏服务按钮点击器

    在尝试 Play Game Services 的按钮点击器演示时 我没有运气 好吧 百分之一 触发 OnInvitationReceivedListener 我看过这里堆栈溢出答案 1和这里堆栈溢出答案 2 并确保使用属于我核心圈子的测试帐
  • 如何从 JFrame 屏幕截图中删除标题栏?

    我正在通过 双缓冲 方法捕获 JFrame 的屏幕截图 如下所示 public BufferedImage getScreenshot java awt Dimension dim this getPreferredSize Buffere
  • 将公式添加到 Excel 工作表会导致 HRESULT:0x800A03EC

    我在网上搜索了合适的解决方案 但找不到任何有用的东西 在 Excel 工作表中 我需要从数据库表中分配一些值 然后在每个值旁边添加一个公式 取决于同一工作簿中的另一个 Excel 工作表 添加数据效果很好 但添加公式会导致错误 我正在获取数
  • 为什么 python 不允许在函数和变量名称中使用连字符?

    我一直想知道为什么我们不能在Python中的函数名和变量名之间使用连字符 尝试过 Lisp 和 Clojure 等允许使用连字符的函数式编程语言 为什么Python不这样做 This won t work SyntaxError def i
  • 使用php的readfile()或重定向来显示图像文件?

    我在 webroot 之外有一个包含图像 css 和 javascript 的目录 这些文件经常更改 我可以编写一个脚本来定位文件 找出 mime 类型并将其输出到浏览器 Or 我可以找到该文件 将其复制到可通过网络访问的目录 然后使用标头
  • 使用步骤对 png 序列进行 CSS 过渡

    我正在尝试使用 PNG 序列制作动画 该序列在悬停时有一个过渡 并在悬停状态结束时动画返回 为此 我使用带有 steps 计时函数的 css 转换 如下所示 transition background 5s steps 9 end 请参阅小
  • 在 CentOS 64 位上的 Ruby 1.9.2 中安装 ruby​​gem 'mysql2' 时出现编译器错误

    a CentOS 64 位服务器有红宝石 1 8 7 和 1 9 2 没有 RVM 需要没有 RVM 目前所有 Ruby1 9 2 二进制文件都是 ruby 19 并且同样可以访问 所以没有宝石路径的映射或任何类似的东西 安装时出现错误宝石
  • 使用 JavaScript 进行服务器轮询

    使用 JavaScript 轮询服务器有哪些好的做法 需要非常快速地刷新数据的应用程序 我使用 jQuery 作为前端 使用 Java Spring Framework 作为后端 刷新数据的示例可以是更新非常快 每 1 秒 的项目列表 您可
  • 为什么使用“for”循环在程序中添加两次“int”标签时输出不同?

    我是一名学习者 也是 C 语言的新手 当我创建一个使用 for 循环给出两个数字的幂的函数时 我遇到了在循环开始之前使用 int 声明以及在循环中更改程序输出的情况 为什么会这样呢 使用 int 声明一次的代码具有正确的输出 include
  • Android:在Activity之间传递哈希图

    我有一个字符串和类对象之间的映射 我在活动 1 中填充此地图 并希望将其传递给活动 2 public class NEW extends Activity public class data String name float value
  • Chrome 扩展 - 在内容脚本中接收请求

    有没有更好的方法在内容脚本和弹出窗口 背景之间传递命令 现在我正在做这样的事情 而且它不可维护或不健壮 chrome runtime onMessage addListener request sender sendResponse gt
  • 自定义index.html javadoc页面?

    我正在使用 ant 任务运行 javadoc
  • MATLAB 到 Python 代码转换(NumPy、SciPy、MatplotLib?)

    我正在尝试将以下代码从 MATLAB 转换为 Python 以用于 EEG 项目 部分原因是 Python 稍微便宜一些 希望有人能指出我正确的方向 我已经开始改变它但陷入困境 特别是试图找到等效的功能 尝试过 scipy org NumP
  • 添加默认不可为空列时的 Oracle 错误

    我过去在 Oracle 11g 的各种实例中都遇到过这个错误 无法亲自访问 Oracle 支持来了解这是否是已识别 已解决的问题 该错误会导致查询始终返回列的默认值 即使记录实际上具有不同的值也是如此 它仅在特定查询中出现 并且是通过使用单
  • Excel / VBA - 使用动态范围的索引匹配函数

    如何有效地使用Index MatchVBA中的公式 背景 我有一个工作表 该工作表在很大程度上依赖于公式的使用 该公式根据将特定名称与其名称范围以及特定日期与其日期范围相匹配来检索输出 INDEX OutputRange MATCH 1 N
  • 如何计算两个日期之间的季度数

    问题一 您如何计算开始日期之间的季度数 base date变量 和ypandas 数据框中的列 from dateutil relativedelta import relativedelta import pandas as pd imp
  • 将锚标记替换为 span 或 div 或 p

    我有一个功能 一旦用户单击链接 就会发出 ajax 请求 如果发出请求 则该链接不应再单击 这是我用来完成此任务的方法 a id rsvp click function e e preventDefault post this data u
  • PHP - 多维数组差异

    我想请求你的帮助 因为我很难解决这个问题 我创建了一个函数来促进数组差异 但它不足以满足我的需求 谢谢 还有更多的力量
  • 设置 sbt 使用 Java 7 进行编译?

    我在运行时遇到编译错误compile任务 因为源引用了新类java nio file仅出现在 Java 7 中的包 我有以下内容build sbt javaHome Some file opt jdk jdk1 7 0 fork true
  • 重试之前的任务操作 TPL

    我想实现一个重试任务 该任务采用先前失败的任务操作并重复它 这是我到目前为止所拥有的 然而 它只是重复任务出错的事实 而不是再次实际触发任务的操作 public static async Task