如何在并发中给 HttpClient 设置不同的超时时间?

咨询区

  • boot4life

为了能够复用 HttpClient 所打开的TCP链接,我不得不让所有的request共享一个单例,但问题来了,如果我简单的在每一次request之前修改 timeout 属性的话,会存在下面两个问题。

  1. 线程不安全。

  2. 并发时可能会错用到其他 request 的超时配置。

请问我该如何正确的处理?

回答区

  • Todd Menier

你说的这种场景理论上是不可以设置 Timeout 属性,但不要忘了,你可以用 .NET 库中提供的取消机制类 CancellationTokenSource,你可以在每一次 request 中带入 token 即可,然后用 CancelAfter() 方法来实现 Timeout 的功能,参考如下代码:

static async Task Main(string[] args){var httpClient = new HttpClient();var cts = new CancellationTokenSource();cts.CancelAfter(TimeSpan.FromSeconds(30));await httpClient.GetAsync("http://www.google.com", cts.Token);}

哦,对了, HttpClient 的默认超时时间是 100s,如果你在 CancelAfter 中设置了过大的超时时间,本质上来说并没有效果,为了解决这个 Max 的问题,我建议你给 HttpClient 设置一个无限期的超时,参考代码如下:

static async Task Main(string[] args){var httpClient = new HttpClient();httpClient.Timeout = System.Threading.Timeout.InfiniteTimeSpan;var cts = new CancellationTokenSource();cts.CancelAfter(TimeSpan.FromSeconds(30));await httpClient.GetAsync("http://www.google.com", cts.Token);}
  • Brad Albright

楼上的大佬说的非常好,但在我的场景下是这么实现的,首先我有一个默认的 CancellationToken ,它可被用户手工干预,另外还有一个 CancellationToken,它是为了模拟 timeout 的 CancelAfter ,然后通过 CancellationTokenSource.CreateLinkedTokenSource 来将两者结合起来,就可以做到既可以被 timeout 结束也可以被用户手工干预停止,下面是我的案例代码:

public async static Task<HttpResponseMessage> SendRequest(CancellationToken cancellationToken)
{var ctsForTimeout = new CancellationTokenSource();ctsForTimeout.CancelAfter(TimeSpan.FromSeconds(5));var cancellationTokenForTimeout = ctsForTimeout.Token;using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancellationTokenForTimeout)){try{return await httpClient.GetAsync("http://asdfadsf", linkedCts.Token);}catch{//just for illustration purposesif (cancellationTokenForTimeout.IsCancellationRequested){Console.WriteLine("timeout");}else if (cancellationToken.IsCancellationRequested){Console.WriteLine("other cancellation token cancelled");}throw;}}
}

点评区

说实话,用 CancellationToken 来替代 Timeout 机制确实是一个非常好的想法,如果大家细心的话,会发现 Framework 中很多涉及IO的操作都实现了这种 取消机制,值得大家好好研究学习,比如下面代码:

public Task<HttpResponseMessage> DeleteAsync(Uri? requestUri, CancellationToken cancellationToken);
public Task<byte[]> GetByteArrayAsync(string? requestUri, CancellationToken cancellationToken);
public Task<Stream> GetStreamAsync(Uri? requestUri, CancellationToken cancellationToken);
public Task<string> GetStringAsync(string? requestUri, CancellationToken cancellationToken);
public Task<HttpResponseMessage> PutAsync(Uri? requestUri, HttpContent content, CancellationToken cancellationToken);
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时事件日志记录和聚合的平台——Sentry

不管你用什么编程语言&#xff0c;都会面临如何处理错误日志的问题。很多程序员对错误日志放任自流&#xff0c;直到出现故障了才追悔莫及&#xff0c;如果问小编怎么办&#xff0c;我会给你推荐 Sentry&#xff01;什么是Sentry&#xff1f;无论测试如何完善的程序&#xff0c…

如何在html里加入验证码_如何把crc校验加入到对应的程序里?看高手怎么做

我们现在已经搞清楚了crc校验的算法&#xff0c;本文我就向大家具体讲解一下如何把crc校验加入到我们的程序里。1 、crc校验使用原理crc校验在程序中运行的原理主要可以分为以下几步。第一步&#xff1a;主站发送数据前把要发送的数据进行crc校验&#xff0c;将要发送的数据和c…

Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)

&#xfeff;&#xfeff;1、Dalvik虚拟机架构和Java虚拟机的架构不同 1、Java虚拟机基于栈结构&#xff0c;需要频繁从栈读取或写入数据&#xff0c;这个过程需要更多的指令与内存访问次数&#xff0c;会消耗cpu时间 2、Dalvik虚拟机基于寄存器&#xff0c;数据访问通过寄存器…

cacti及其相关插件的安装

cacti是什么&#xff1f;1. cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool储存和更新数据&#xff0c;当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此&#xff0c;snmp和rrdtool是cacti的关键。Snmp关系…

.net 测试工具类

fluentassertions QuickStart (替换Assert )https://github.com/dennisdoomen/fluentassertions/wiki Moq QuickStarthttps://github.com/Moq/moq4/wiki/Quickstart转载于:https://www.cnblogs.com/peteryu007/p/4081265.html

6张图,带你深入理解GitOps,真硬核!

大家好&#xff0c;我是小碗汤&#xff0c;今天分享一篇6张图深入理解GitOps&#xff0c;内容硬核&#xff0c;建议兄弟们收藏~在使用 K8s 的云原生应用中&#xff0c;Serverless&#xff0c;Devops 工具以及大量其他云技术。通常&#xff0c;基础设施代码和应用程序代码是分开…

css 字体加粗_HTML基础属性与CSS基础

有头发且有趣的码农万里挑一~ 40有料叔 | 一位有故事的程序猿1HTML基础属性1.class属性&#xff1a;用于定义元素的类名&#xff0c;如需为一个元素规定多个类&#xff0c;用空格分隔类名定义格式&#xff1a;2.name属性&#xff1a; 用于指定标签元素的名称。Name属性的值可以…

OPENSSL ENGINE机制

1&#xff0e; 概念 OpenSSL项目是一个开放源代码安全项目&#xff0c;它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包&#xff0c;用强大的加密算法来实现安全的Socket层&#xff08;Secure Sockets Layer&#xff0c;SSL v2/v3&#xff09;和传输层的安全性…

mongoDB的副本机制

主机192.168.99.80[rootmaster ~]# grep -v "^#" /etc/mongod.conf | grep -v "^$" bind_ip 192.168.99.80 fork true pidfilepath /var/run/mongodb/mongod.pid logpath /var/log/mongodb/mongod.log unixSocketPrefix /var/run/mongodb dbpath /mo…

文件系统一些概念【更新完毕】

煮酒品茶&#xff1a;文章大多摘自《分布式文件系统研究》《构建高性能WEB站点》《大型网站技术架构》文件系统是操作系统的一个重要组成部分&#xff0c;通过对操作系统所管理的存储空间的抽象&#xff0c;向用户提供统一的、对象化的访问接口&#xff0c;屏蔽对物理设备的直接…

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

Win32NET是一个Win32API的.NET下封装的类库&#xff0c;包含&#xff1a;1: 常用win32的API的net封装2&#xff1a;鼠标、键盘、热键hook钩子模块&#xff0c;3&#xff1a;模拟键盘输入文字&#xff08;支持各种字符文字、不同语言的文字&#xff09;、模拟鼠标点击移动滚动等…

linux之如何快速在文本里面写入内容

一、创建文件 touch file 二、写入内容 echo "hello word">>file 图片举例 还有 echo "hello">file 是把之前的内容覆盖&#xff0c;然后内容只有hello 如图&#xff1a; 最后&#xff1a; 无论是echo "hello">file 还是 echo&quo…

css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪

也许你瞧不起以前的 css &#xff0c;但是你不该再轻视眼下的 css 。近年来 css 的变量系统已逐步得到各大浏览器厂商支持&#xff0c;自定义选择器等强势袭来&#xff0c;嵌套系统/模块系统也在路上...为了更好的掌握 css 这门语言&#xff0c;很有必要把之前零零散散的 css 知…

hibernate级联操作详解

2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作&#xff0c;常用的cascade: none,all,save-update,delete, lock,ref…

Oracle数据库的备份与恢复

Oracle数据库有三种标准的备份方法&#xff0c;它们分别是导出&#xff0f;导入&#xff08;EXP/IMP&#xff09;、热备份和冷备份。导出备件是一种逻辑备份&#xff0c;冷备份和热备份是物理备份。一、 导出&#xff0f;导入&#xff08;Export&#xff0f;Import&#xff09;…

关于Windows® API Code Pack for Microsoft® .NET Framework

相比之前的操作系统&#xff0c;Window 7&#xff08;or Vista&#xff09;提供了很多新特性&#xff0c;我们在应用实现中可以利用这些特性来提升用户体验。 这些特性主要包括以下几个方面&#xff1a; Shell EnhancementsDirectX TechnologiesApplication Restart and Recove…

出门就背他了!可伸缩的背包,自由变大变小,还有防盗功能!

▲ 点击查看出门能不背包就不背包&#xff0c;几乎是小爆身边每个男生的人生信条。不背包时&#xff0c;两手空空一身轻&#xff0c;潇洒有型。但一旦到了必须背包&#xff0c;比如五一外出回家或旅游的时候&#xff0c;男同胞们翻箱倒柜找出来的背包&#xff0c;大多都是这种双…

C#实现网页加载后将页面截取成长图片 | Playwright版

前言如何将网页生成预览图&#xff1f;要实现这个功能&#xff0c;可以用WebBrowser组件模拟浏览器&#xff0c;或者使用系统浏览器访问网页&#xff0c;再进行截图操作。但是&#xff0c;这样需要编写大量的控制代码。工欲善其事&#xff0c;必先利其器&#xff01;利用Playwr…