首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步HttpWebRequest

异步HttpWebRequest
EN

Stack Overflow用户
提问于 2011-07-14 13:27:26
回答 3查看 1.3K关注 0票数 2

我正在开发一个网络爬虫,我想使用HttpWebRequest。它允许异步操作,如BeginGetResponse,但使用HttpWebRequest.Create的连接不是异步的--我想同时建立大约1000个连接,所以使用这个方法(使用一个额外的异步线程)我甚至不能获得2个连接,因为直到第二个连接第一个连接已经完成下载内容,这几乎就像我连接到一个页面而不是同时连接到网页一样。

我想知道是否有一个好方法可以使用HttpWebRequest连接大约1000次,而不需要创建大量的线程或其他东西……

提前谢谢。

编辑:最终,慢和阻塞的不是HttpWebRequest,而是BeginGetResponse --它一直阻塞,直到请求头被发送?我怎样才能绕过这个问题,在BeginGetRequestStream中也使用异步发送呢?

EN

回答 3

Stack Overflow用户

发布于 2011-07-14 13:31:12

所有这些连接是否都指向同一个域?

尝试将其添加到您的应用程序/web.config中

票数 1
EN

Stack Overflow用户

发布于 2011-07-14 13:34:47

我不认为你可以在同一个线程上建立多个连接。每个连接需要一个线程。但您可以修改您的设计,使其更具可伸缩性。

您可以创建一个控制线程,它执行所有繁重的任务(或者其中的几个),每个这样的控制线程拆分出几个子线程,这些子线程获取数据并将它们放入父类中的某种数组中。然后,控件类可以循环子线程。一旦一个子线程完成,它就会得到另一个“任务”。IMHO的主要思想是将爬行与检索到的数据的处理分开。获取它,存储它,并稍后处理它。

希望这能在某种程度上有所帮助:)

票数 0
EN

Stack Overflow用户

发布于 2011-08-12 00:07:46

没有理由认为这应该是阻塞的。关于异步web请求的工作方式有一些奇怪的地方,这可能会迫使你假设的异步请求是同步的。对于初学者,如果您实际要过帐数据,则必须使用BeginGetRequestStream (不能混合使用异步和同步)。请参阅:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

如果我没记错的话,WebRequest.Create实际上什么都没有发生,它只是设置了对象,直到BeginGetRequestStream或BeginGetResponse (取决于它是post还是get)请求才开始。

另一个重要的注意是,在我的发现中,读取来自EndGetResponse的流的延迟比从请求读取的延迟要多得多。您还应该在流上使用read的异步版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6688817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档