苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.3-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 426|回复: 7

[HttpHelper] httpHelper发起多次异步请求时如何先结束之前的请求

[复制链接]
发表于 2020-11-12 16:06:59 | 显示全部楼层 |阅读模式
假设有一个按钮,用户点击一下后就会发起一次异步网络请求,使用BeginInvokeGetHtml,请求结果会直接用MessageBox显示。
现在遇到的问题就是用户如果短时间内多次点击按钮,就会发起很多次异步网络请求,等一会后就会弹出很多个MessageBox。
定义的是静态的HttpHelper,每次请求都使用的是同一个HttpHelper对象。
想要实现的效果是,当发起新的异步网络请求的时候,就先干掉之前的请求,保证同一时间段只有一个请求在执行。
但我看了下HttpHelper中,好像并没有取消异步请求的方法,也无法得知现在是否正在进行异步请求。
请问这种情况要如何解决呢?
我不想自己开个县城,在里面调用同步的网络请求,请求完后掉回调方法,发起新的请求前就先干掉之前的县城,这种方法总感觉没那么好。
不知道有没有更好的处理方法呢?多谢。
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2020-11-15 13:29:34 | 显示全部楼层
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
回复 支持 1 反对 0

使用道具 举报

发表于 2020-11-13 08:26:37 | 显示全部楼层
http协议是断开式协议,不是即时通讯,发送之后在发送端是无法控制发送过程和发送返回的结果的。这个和是不是异步没有关系
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2020-11-13 21:42:50 | 显示全部楼层
站长苏飞 发表于 2020-11-13 08:26
http协议是断开式协议,不是即时通讯,发送之后在发送端是无法控制发送过程和发送返回的结果的。这个和是不 ...

感谢解答,不过还有些疑问呢。
如果遇到我上面说的那种场景,用户可以不断的发起新的网络请求,而最终只想展示最后一次请求的结果,这种一般是如何处理的呢?
如果发送端无法停止发送请求跟读取结果的过程的话,我想到的解决方案就是每次请求的时候生成一个唯一ID,病在全局中保存当前请求的ID。
每次请求完成后就判断自己内部的ID跟全局的ID是否相同,如果不同的话证明它并不是最新的请求,已经被丢弃了,那就不调用回调了。
如果这样实现的话,用户要疯狂的点击按钮,那不是会发起N多个请求吗,是否会造成服务器压力等问题呢?
谢谢~
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2020-11-16 11:25:30 | 显示全部楼层
1. 用ID的方式是可以解决这个问题
2. 疯狂的单击这个不存的吧,得有多心大的程序员不限制单击频次的,限制10秒,或者一分钟单击一次,或者没有接收到结果之后不让单击就是了。
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2020-11-17 10:26:04 | 显示全部楼层
想想要实现的功能有没有其他的办法,是不是实现的方向走错了,别人就很难理解你要做什么,也就没法实际的帮到你。
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2020-11-17 11:36:36 | 显示全部楼层
站长苏飞 发表于 2020-11-16 11:25
1. 用ID的方式是可以解决这个问题
2. 疯狂的单击这个不存的吧,得有多心大的程序员不限制单击频次的,限制 ...

好的,感谢解答,不过我在request中看到有Abort方法,看注释是可以用来停止请求,可以用这个方法实现异步的停止请求吗?
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2020-11-17 15:31:08 | 显示全部楼层
zncliving 发表于 2020-11-17 10:26
想想要实现的功能有没有其他的办法,是不是实现的方向走错了,别人就很难理解你要做什么,也就没法实际的帮 ...

我在实际开发项目中有遇到过很多多次请求的问题,例如:
一款软件上方有多个分类tab,用户可以点击选中某个分类,然后发起网络请求,去请求其下的数据。
请求的数据都会在中间显示,如果请求失败了也会显示出失败信息。
如果不对请求做唯一性处理的话,就会出现用户选择了分类1后快速的选择分类2,如果在网络不好的情况下,有可能分类1的数据返回速度是低于分类2的。
那就会出现先显示了分类2的数据,然后过一会又显示出了分类1的数据,但此时用户其实只想看分类2的数据。
所以要么就请求分类2之前停止分类1的请求,要么就有种机制可以不去处理分类1的数据。
后者我想到的解决方案就是用ID的方式去处理。
至于用户快速的点击不同的分类,导致不断发起多次请求,我现在想到的一个比较好的解决方案是:
每次请求时,先判断上次请求是否结束,如果没有结束,并且跟上次发起请求之间间隔不超过0.5秒,就吧本次请求加入到一个list中,先不真正的去请求。
然后在内部开启一个时钟,等0.5秒后去执行list中的最后一次请求。
这样理论上可以解决用户疯狂点击不同分类所导致的短时间多次网络请求的问题。
不知道是否有更好的处理方案?
找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1)

GMT+8, 2020-12-4 21:37

© 2014-2021

快速回复 返回顶部 返回列表