Polly 的 Policy.TimeoutAsync 不适用于异步上下文中的 PolicyWrap

2023-12-13

这是一个完全有效的示例(复制/粘贴它并尝试一下,只需获取 Polly Nuget)

我有以下控制台应用程序代码,它向 ' 上的 HTTP 客户端沙箱发出 POST 请求http://ptsv2.com/t/v98pb-1521637251/post'(您可以访问此链接“http://ptsv2.com/t/v98pb-1521637251”查看配置或让自己成为一个“厕所”):

class Program
{
    private static readonly HttpClient _httpClient = new HttpClient()
        ; //WHY? BECAUSE - https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
    static void Main(string[] args)
    {
        _httpClient.BaseAddress = new Uri(@"http://ptsv2.com/t/v98pb-1521637251/post");
        _httpClient.DefaultRequestHeaders.Accept.Clear();
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));

        var result = ExecuteAsync("Test").Result;
        Console.WriteLine(result);
        Console.ReadLine();
    }

    private static async Task<string> ExecuteAsync(string request)
    {
        var response = await Policies.PolicyWrap.ExecuteAsync(async () => await _httpClient.PostAsync("", new StringContent(request)).ConfigureAwait(false));
        if (!response.IsSuccessStatusCode)
            return "Unsuccessful";
        return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    }
}

Http 客户端等待 4 秒,然后返回响应。

我已经制定了这样的政策(超时策略设置为等待1秒响应):

public static class Policies
{
    public static TimeoutPolicy<HttpResponseMessage> TimeoutPolicy
    {
        get
        {
            return Policy.TimeoutAsync<HttpResponseMessage>(1, onTimeoutAsync: (context, timeSpan, task) =>
            {
                Console.WriteLine("Timeout delegate fired after " + timeSpan.TotalMilliseconds);
                return Task.CompletedTask;
            });
        }
    }
    public static RetryPolicy<HttpResponseMessage> RetryPolicy
    {
        get
        {
            return Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
                    .Or<TimeoutRejectedException>()
                    .RetryAsync(3, onRetryAsync: (delegateResult, i) =>
                    {
                        Console.WriteLine("Retry delegate fired for time No. " + i);
                        return Task.CompletedTask;
                    });
        }
    }
    public static FallbackPolicy<HttpResponseMessage> FallbackPolicy
    {
        get
        {
            return Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
                    .Or<TimeoutRejectedException>()
                    .FallbackAsync(new HttpResponseMessage(HttpStatusCode.InternalServerError), onFallbackAsync: (delegateResult, context) =>
                    {
                        Console.WriteLine("Fallback delegate fired");
                        return Task.CompletedTask;
                    });
        }
    }

    public static PolicyWrap<HttpResponseMessage> PolicyWrap
    {
        get
        {
            return Policy.WrapAsync(FallbackPolicy, RetryPolicy, TimeoutPolicy);
        }
    }
}

但是, onTimeoutAsync 委托根本没有被命中,控制台打印出以下内容:

Retry delegate fired for time No. 1 //Hit after 4 seconds
Retry delegate fired for time No. 2 //Hit after 4 more seconds
Retry delegate fired for time No. 3 //Hit after 4 more seconds
Fallback delegate fired
Unsuccessful

它包含在 PolicyWrap 中并且是异步的,我不知道为什么它没有被命中。 任何信息都受到高度赞赏。


Polly 超时策略使用默认的TimeoutStrategy.Optimistic通过超时操作CancellationToken,因此您执行的委托必须响应合作取消。请参阅波莉超时维基了解更多详情。

将执行行更改为以下内容应该可以使超时生效:

var response = await Policies.PolicyWrap.ExecuteAsync(
    async ct => await _httpClient.PostAsync(/* uri */, new StringContent(request), ct).ConfigureAwait(false), 
    CancellationToken.None // CancellationToken.None here indicates you have no independent cancellation control you wish to add to the cancellation provided by TimeoutPolicy. You can also pass in your own independent CancellationToken.
);

默认情况下 Polly 异步执行不要继续捕获同步上下文(他们执行.ConfigureAwait(false)),所以这也可以缩短为:

var response = await Policies.PolicyWrap.ExecuteAsync(
    ct => _httpClient.PostAsync(/* uri */, new StringContent(request), ct), 
    CancellationToken.None
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Polly 的 Policy.TimeoutAsync 不适用于异步上下文中的 PolicyWrap 的相关文章

  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • 是否返回 std::move (x)?

    Are std vector
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 二维数组的列求和

    我有一个IEnumerable
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • Yii框架异步请求

    我有一个执行 3 个任务的 ajax 请求 保存模型 数据库 发电子邮件 给出成功或失败的消息 因为这个任务需要的时间太长了 用户最多可以等待 20 秒以获得响应 成功或失败消息 如果用户关闭浏览器 则其会停止用户当前进程的操作之一 这是糟
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 使用 matplotlib 在 Tkinter 中绘制数据 - 在列表之间切换

    我正在创建一个程序 利用Tkinter and matplotlib 我有 2 个列表列表 一个用于 x 轴 一个用于 y 轴 我希望有一个可以在列表中的列表之间切换的按钮 我从问题中获取了大部分代码基于Tkinter和matplotlib
  • 检测本地和远程之间不同步的所有标签

    有没有一种简单的方法可以确定本地存储库中哪些标签与远程不同步 不同步是指完全相同的标签名称指向本地与远程上的不同提交 我能想到的两种导致这种情况的方法可能是 有人 或某物 移动了我之前获取的标签 也许它被删除并重新创建 或者它是在它已经存在
  • 将 Java 代码与烘焙到 .jar 中的数据一起传送

    我需要发送一些具有关联数据集的 Java 代码 它是一个设备模拟器 我希望能够将用于模拟记录的所有数据包含在一个 JAR 文件中 在这种情况下 每个模拟记录包含四个字段 主叫方 被叫方 呼叫开始 呼叫持续时间 最好的方法是什么 我已经沿着以
  • 比较 ReadOnlyMemory 实例的最佳方法?

    The ReadOnlyMemory
  • 显示/隐藏 div,使用纯 JS

    My CSS a x200 visibility hidden width 200px height 200px background color black My JS 我的HTML div asd div
  • 如何将像素转换为 xamarin.forms 单位?

    每英寸有 160 个单位 2 如果我创建了一个Photoshop文件为 72dpi那么每英寸就有 72 个点 3 如果元素是88px身高在Photoshop那么我必须将其设置为xamarin 如果手机是 360dpi 那么 xamarin
  • 将双精度型转换为整型?

    我的代码如下 int main int argc char argv double f 18 40 printf d n int 10 f return 0 在VC6 0中结果是184 而Codeblock中结果是183 为什么呢 原因是
  • Symfony 任务 - 内存泄漏

    我编写了一个 symfony 任务来填充示例数据的数据库 这是一段示例代码 gc enable Propel disableInstancePooling public function test for i 0 i lt 10000 i
  • 保持绘制图形 - 删除 super.paintComponent

    我有一个名为 Foo 的类 它扩展了一个名为 Bar 的类 该类扩展了 JPanel 并实现了 ActionListener 当我选择圆形并单击绘制按钮时 我会绘制一个圆形 而当我按矩形并单击绘制时 它会擦除 以前的形状并绘制一个矩形 但是
  • osmdroid 经典标记重叠的解决方法

    我正在使用 osmdroid 和 osm Bonus Pack 开发 Android 离线地图应用程序 并从外部存储加载图块和数据 现在 随着数据的增长 标记开始变得拥挤在一起 我什至有同一建筑物上两个地方的情况 我知道这种问题以前已经被问
  • 范围报告:无法在其他机器上看到屏幕截图

    我可以在本地计算机上生成带有屏幕截图的范围报告 但是 当我将报告邮寄给其他人 或在不同的计算机上打开 html 时 屏幕截图不可见 它说该路径无效 在附加屏幕截图时 我给出了本地计算机的路径 它也在其他机器上搜索相同的路径 我也尝试将 ht
  • 在 Python 中使用 Twain 模块

    我有 64 位 Windows 和 64 位 Python 在里面吐温文档说 只支持32位 我用过吐温数据源安装我的 64 位机器并使用此代码连接扫描仪设备 import twain sm twain SourceManager 0 ss
  • 如何在 UWP 中使用 3 级语义缩放?

    我想使用语义缩放 或其效果 在我的 UWP 应用程序中选择位置 我想首先选择县 第二选择城市 第三选择位置 有人对此有真实的想法吗 我搜索了多个缩放以进行语义缩放 但这显然是不可能的 我使用了两个语义缩放视差 但这也有其问题 有人可以帮忙吗
  • Neo4j 中跨多个字段的全文搜索示例?

    我见过一些简单的文本搜索示例STARTS WITH name例如 http www jexp de blog html full text and spatial search in neo4j 3 html https blog knol
  • 为什么验证规则的行为(仅)与 onDisconnect 更新不同?

    我用 firebase 做了一些测试 发现规则验证之间存在差异onDisconnect update 和简单的update using newData parent 在规则中 当我使用update 有用 但与onDisonnect upda
  • Python 列表的 += 运算符等同于append() 或extend() 吗? [复制]

    这个问题在这里已经有答案了 Python 列表有一个 运算符以及append and extend方法 If l是一个列表 是l 相当于l append l extend 两者都存在 还是两者都不存在 在 python 中 列表上的 相当于
  • Make file 不检测源文件中的更改

    我对 make 文件非常陌生 我面临着非常基本的问题 我的 Makefile 没有检测到我对源文件所做的更改 问题是 当我第一次从源文件生成 consoleapp 二进制文件时 我得到了预期的输出 但是当我再次更改源文件并再次运行 make
  • 为什么这个 awk 脚本看不到 shell 变量?

    请告诉我为什么这个程序不起作用 帮助我改进它 for i in seq 2 30 do awk if i lt 0 05 print 1 i test txt gt phen i txt done 文件 test txt 如下所示 name
  • 如何从 swift 将浮点数数组的数组传递给 C++ 函数

    我有一个 C 函数声明于Bridging Header h struct MyFloat3 float x float y float z struct MyFloat3 ExtCurl const float triangle 我已按照以
  • Polly 的 Policy.TimeoutAsync 不适用于异步上下文中的 PolicyWrap

    这是一个完全有效的示例 复制 粘贴它并尝试一下 只需获取 Polly Nuget 我有以下控制台应用程序代码 它向 上的 HTTP 客户端沙箱发出 POST 请求http ptsv2 com t v98pb 1521637251 post