【问题标题】:Asynchronous HttpWebRequest异步 HttpWebRequest
【发布时间】:2011-07-14 05:27:25
【问题描述】:

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

我想知道是否有一种好方法可以使用 HttpWebRequest 连接大约 1000 次,而无需创建大量线程或任何东西...

提前致谢。

编辑: 最终不是 HttpWebRequest 缓慢且阻塞,而是 BeginGetResponse - 它在发送请求标头之前一直阻塞?我怎样才能绕过这个,使用异步发送以及 BeginGetRequestStream?

【问题讨论】:

    标签: c# asynchronous httpwebrequest


    【解决方案1】:

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

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

    连接管理>

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 最终不是 HttpWebRequest 缓慢且阻塞,而是 BeginGetResponse - 它在发送请求标头之前一直阻塞?我怎样才能绕过这个,使用异步发送以及 BeginGetRequestStream?
      【解决方案3】:

      没有理由让这个被阻塞。关于异步 Web 请求的工作方式有一些奇怪之处,这可能会强制您假定的异步请求是同步的。对于初学者,如果您实际上是在发布数据,则必须使用 BeginGetRequestStream(不能混合使用 asynch 和 synch)请参阅:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 1970-01-01
        • 2011-07-30
        相关资源
        最近更新 更多