这是我自己在某论坛上发的一篇水贴:http://www.sufeinet.com/thread-9275-1-2.html,原理和解释,我就直接重发一遍在自己博客上了。

时隔一个月  回来把之前的坑填上。之前发的两篇文章链接如下: http://www.sufeinet.com/thread-8876-1-1.htmlhttp://www.sufeinet.com/thread-8882-1-1.html

跟之前的区别在于 这一次是完整 真正可用的代码 可以完全用于商业目的  因为我已经不间断的跑了一个月 没有任何问题。
     异步实现的最大坑在于   你发出一个异步请求之后 你可能收不到任何响应 ,你发出的包,可能在Internet上看风景去了,漫游去了,或者被各种延迟,各种阻塞,或者被路由器负载脱落,各种丢失,TCP建立起的连接对应于网络层的VC(虚电路)可能以各种形式断开然后你永远不会知道。。
所以 由于网络层的各种不稳定 所以在传输层你必须建立起稳妥的解决方案 将控制权把握在自己手上。
解决方案很简单。计数器而已。  计数器让线程池帮我们做就好了:
   System.Threading.ThreadPool.RegisterWaitForSingleObject(m_ar.AsyncWaitHandle,
                    TimeoutCallback, pa, MyAsyncPara.DefaultTimeOutSpan, true);

这段代码使用一个信号量,用CLR的用户模式构造  System.Threading.Interlocked.Increment(ref pa.m_semaphore) != 1   超时便不再处理数据

OK了,现在来看看调用:

HttpItems hi = new HttpItems();
AsyncHttpHelper wh = new AsyncHttpHelper();
hi.URL = urlinfo.Url;
wh.GetHtmlDataAsync(hi, YourCallBackMethod);

void YourCallBackMethod(HttpResults result)
{

}

好了 代码跑起来的效果就是,一个线程处理处理一堆爬取任务速度飞快有木有!绝对不卡当前线程有木有!

最后提2点注意事项:
1  以太网协议的最大允许字节为1500多  无线局域网的最大允许字节为2200多 IP协议最大允许字节为65500多  为了让爬虫适合在任意网络上执行 缓存区设置为1KB比较合适

2 同学们 请对你们自己注入IP网络的数据包负责 因为不管是电脑还是路由器 他们的TCP栈大小总是有限的 过多的数据注入 会导致丢包 网络拥塞  ,请慎重计算你要注入网络的数据包量。一句话 不要无限制的发起请求 因为多的请求最终会超时 而你很可能是造成网络拥塞的元凶。

欢迎测试或拍砖。

源代码改日上传(。。我忘了论坛密码,或者直接上论坛上下载也可。)论坛上下载次数已经接近两百次。

觉得用得上,您就点个赞。

异步http请求的实现的更多相关文章

  1. iOS 多个异步网络请求全部返回后再执行具体逻辑的方法

    对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...

  2. Android中的异步网络请求

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...

  3. jmeter 异步子请求测试随笔

    好久没写技术类的博客了,都不知道自己都在忙啥.... 最近陆续遇到了一些异步子请求的测试需求,比如打开某一个页面A,A页面里的js会再调用B,C,D,E等请求,针对这个页面的测试,我最近做了一些思考: ...

  4. Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  5. jquery.ajax异步发送请求的简单测试

    使用ajax异步发送请求到一般处理程序,判断输入的用户名和密码 1.添加Html页面,导入jquery 2.编写js代码和页面标签 <script type="text/javascr ...

  6. JavaScript异步并发请求问题

    JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题

  7. Android Asynchronous Http Client-Android异步网络请求客户端接口

    1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...

  8. AJAX其实就是一个异步网络请求

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).其实就是一个异步网络请求. 一.创建对象 var xmlhttp; if (w ...

  9. IOS9中使用NSURLConection发送异步网络请求

    IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...

  10. 基于netty的异步http请求

    package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...

随机推荐

  1. Luckily general gradient for spherical harmonics is defined

    http://web4.cs.ucl.ac.uk/staff/j.kautz/publications/gradientSH_RS04.pdf

  2. UWP平台Taglib编译(1)

    此文已由作者郑博授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 最近开始开发UWP平台的App,项目需要用到Taglib进行音视频文件的标签信息读写,Google并没有现成的B ...

  3. python 调试器

    pdb https://www.zhihu.com/question/21572891 https://zhuanlan.zhihu.com/p/43846098

  4. 870. Advantage Shuffle

    Given two arrays A and B of equal size, the advantage of A with respect to B is the number of indice ...

  5. C# Winform下一个热插拔的MIS/MRP/ERP框架13(窗体基类)

    作为一个ERP数据处理框架,大部分的开发场景都差不多. 理想中,对于通用数据处理,我的步骤如下: 1.为窗体指定数据来源(数据表/查询等): 2.拖入编辑控件,指定绑定字段: 3.结束. 为此,我设计 ...

  6. PHP删除一个目录下的所有文件,不删除文件夹

    /*删除指定目录下的文件,不删除目录文件夹*/ function delFile($dirName){ if(file_exists($dirName) && $handle=open ...

  7. iOS开发之-Debug、Release、Archive、Profile、Analyze

    1,Debug和Release版本区别? 众所周知,我们进行iOS开发,在Xcode调试程序时,分为两种方式, Debug 和 Release ,在Target的Setting中相信大家应该看到很多选 ...

  8. Levenshtein字符串距离算法介绍

    Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上 ...

  9. uC/OS-II 函数之OSInit()

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 对于有热心的小伙伴在微博上私信我,说我的uC/OS-II 一些函数简介篇幅有些过于长应该分开介绍.应小伙伴的要求,特此将文章分开进行讲解.本文主要 ...

  10. iOS 逆向工程

    HOOK(钩子函数)在OCD动态化语言中使用swizzle method (交换方法来实现) 实际上静态C语言中的函数也是有办法hook的,这也说明绝对的静态语言是不存在的 Mach-O:对于每个操作 ...