http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 9861|回复: 9

[其他] 关于Abort()方法中止不了线程(Socket接收)

[复制链接]
发表于 2016-6-16 21:02:06 | 显示全部楼层 |阅读模式
开一个线程用于Socket(TCP协议)接收,超过一定时间未接收到回应就在主线程中调用Abort()方法中止线程。

但是实际调用Abort方法后线程未中止,百度了一下有人说一个线程调用Abort中止另一个线程时线程不会立即中止或者根本不会中止,

另外建议尽量不要用Abort方法中止线程,但是Socket接收时一直阻塞线程,目前未找到合适的方法做到超时后Socket接收线程中止或者跳出线程。

技术有限望指教一下~~





1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2016-6-17 08:24:53 | 显示全部楼层
这方法一般是会正常执行的,至于于不会执行是分情况的,你的应该没有问题,你可以试试,一试就明白了吧。
 楼主| 发表于 2016-6-22 09:42:09 | 显示全部楼层
站长苏飞 发表于 2016-6-17 08:24
这方法一般是会正常执行的,至于于不会执行是分情况的,你的应该没有问题,你可以试试,一试就明白了吧。

Socket接收的时候其他线程调用Abort(),调试的结果是线程不会停止。
 楼主| 发表于 2016-6-22 09:46:38 | 显示全部楼层
站长苏飞 发表于 2016-6-17 08:24
这方法一般是会正常执行的,至于于不会执行是分情况的,你的应该没有问题,你可以试试,一试就明白了吧。

就是用一个Timer,开始接收时计时,时间到后Tick()调用Abort()方法中止线程。
结果就是超时后线程未中止,仍然在接收的状态。
发表于 2016-6-22 11:00:07 | 显示全部楼层
这样啊,里面是个循环是吧,那你还不如直接设置个开关,到时候直接修改为关,程序执行到这里直接就结束了。这样还能保证逻辑的完整性
发表于 2016-6-22 11:41:52 | 显示全部楼层
站长苏飞 发表于 2016-6-22 11:00
这样啊,里面是个循环是吧,那你还不如直接设置个开关,到时候直接修改为关,程序执行到这里直接就结束了。 ...

飞哥,这问题我现在也碰到了。就是在执行这一句时,
                result = http.GetHtml(item);
好像进入了一个循环等待中。设置的timeout似乎是告诉对方服务器的超时时间,但是有些服务器好像并不起作用,返回结果的时间远远大于这个设定的值。

在主线程中对子线程调用abort方法产生的异常中断根本无法停止这种情况的线程。
飞哥对着问题怎么看?

 楼主| 发表于 2016-6-22 13:52:37 | 显示全部楼层
站长苏飞 发表于 2016-6-22 11:00
这样啊,里面是个循环是吧,那你还不如直接设置个开关,到时候直接修改为关,程序执行到这里直接就结束了。 ...

到不是循环,只是Socket在执行receive方法阻塞线程了,就是因为一直阻塞线程所以无法在超时后在线程里设置条件让线程结束。
发表于 2016-6-22 14:28:13 | 显示全部楼层
zdking 发表于 2016-6-22 11:41
飞哥,这问题我现在也碰到了。就是在执行这一句时,
                result = http.GetHtml(item);
好 ...

不怎么看,Http协议就是这样,客户端负责,发送,服务端负责响应,客户的所有配置要看服务端愿意与否,服务端不断开,你设置了也是无效了,只有超过IIS之类的超时时间才会结束的。这个其实很正常。有问有答才对,如果发送了再你一个强制断开不接收结果的方法,那不就成了DDOS攻击了吗?你想一下是不是
发表于 2016-6-22 21:53:03 | 显示全部楼层
站长苏飞 发表于 2016-6-22 14:28
不怎么看,Http协议就是这样,客户端负责,发送,服务端负责响应,客户的所有配置要看服务端愿意与否,服 ...

也是。但是如果服务器一直不相应,我这边程序就一直处于等待状态了。这样后面的流程全都因为这一个线程的等待而卡在这里了。这怎么解决啊?
发表于 2016-6-23 08:46:08 | 显示全部楼层
zdking 发表于 2016-6-22 21:53
也是。但是如果服务器一直不相应,我这边程序就一直处于等待状态了。这样后面的流程全都因为这一个线程的 ...

设置个超时时间就行了,一般服务器都会执行,最长也不过120秒,你要取的数据所在网站慢,这个怕是没办法解决,这个不是客户端能控制的。你下面流程如果和这里的数据有关,就是提前结束了也没用啊,没有数据你走什么流程呢?走了也就是得到一个不对的结果吧。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-4-29 23:57

© 2014-2021

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