Asynchronous HttpWebRequest

本文关键字:HttpWebRequest Asynchronous | 更新日期: 2023-09-27 18:02:32

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

我想知道如果我有一个好方法来连接大约1000次使用HttpWebRequest而不创建吨的线程或任何东西…

提前感谢。

编辑:最终它不是HttpWebRequest是缓慢和阻塞,它是BeginGetResponse -它阻塞,直到请求头被发送?我怎么能绕过这个,使用异步发送以及BeginGetRequestStream?

Asynchronous HttpWebRequest

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

尝试将此添加到app/web.config

& lt; system.net>& lt; connectionManagement>& lt;添加地址="*";maxconnection ="1000";/比;& lt;/connectionManagement>& lt;/system.net>

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

你可以创建一个控制线程来完成所有繁重的工作(或者可能是其中的几个),每个这样的控制线程产生几个子线程,这些子线程出去获取数据并将它们放在父类中的某种数组中。然后控制类可以回收子线程。一旦子线程完成,它就会得到另一个"任务"。恕我直言,其主要思想是将抓取与检索数据的处理分离开来。获取它,存储它,以后再处理它。

希望对大家有所帮助

没有理由让阻塞。异步web请求的工作方式有一些奇怪的地方,可能会迫使你的异步请求变成同步请求。对于初学者来说,如果你实际发布数据,你必须使用BeginGetRequestStream(你不能混合异步和同步),参见:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

如果我没有记错的话,实际上WebRequest没有发生任何事情。创建,它只是设置对象,请求不会开始,直到BeginGetRequestStream或BeginGetResponse(取决于它是post还是get)。

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