c# - 优化新闻获取

标签 c# multithreading windows-phone-7 optimization web-scraping

我有一个网络抓取工具,用于从 wp7 中的不同来源抓取新闻。 我目前的做法是:

  • 从 xml 文件加载报纸信息。
  • 转到指定部分并获取新闻条目的网址。
  • 转到每个网址并获取标题、图片、发布商。
  • 使用Windows Phone的MVVM架构进行显示。

整个事情是异步发生的...意味着一旦从报纸的某个部分获取 url,它就会被添加到队列中,并且由获取标题、图像等组成的第二阶段开始...并且一旦即使是一篇文章也会获取此信息并显示。稍后,随着获取更多文章,它们将被添加到列表中。

出于获取目的,我使用适用于 Windows Phone 的 SmartThreadPool( http://www.codeproject.com/Articles/7933/Smart-Thread-Pool )。

我的问题是...即使从 9 个出版物中获取大约 80 个项目(总共),也需要一分钟多的时间。 我怎样才能加快这个过程?

注意:我采用两阶段方法,因为很多时候图像不包含标题,只能在文章中找到。

最佳答案

发出 80 个网络请求并获得 80 个响应需要超过一分钟的时间,这并不奇怪。即使在有线连接上,请求和响应之间通常也需要至少 500 毫秒的时间。根据服务器和您的连接,请求和响应之间有一整秒的延迟并非不合理。这还不包括下载内容所需的时间。

您的 3 Mbps 链路是每秒 3 兆*位*,或每秒不到 400 KB,并且将与使用同一塔或连接点的其他人共享。

我对SmartThreadPool不熟悉,也不知道你是如何使用它的。不过,它很可能限制了并发线程的数量,并且您每个请求使用一个线程。因此,如果它限制您最多 4 个并发线程,那么您最多只能每秒下载 4 次。

如果您使用单个线程发出多个异步 Web 请求,则可以有 15 个(可能更多)并发请求。由于发出 Web 请求的大部分时间都花在等待服务器的响应上,因此与其他方法相比,这将大大提高性能。假设您下载的新闻文章不是很大,限制因素是带宽。

根据您的描述,我想说您不需要执行任何显式多线程处理。只需使用异步网络请求即可。

当然,所有这些都是猜测,因为您没有显示任何代码或以详细描述的方式提供太多内容。但如果我要写一个像你描述的那样的新闻爬虫,这就是我会采取的方法。

关于c# - 优化新闻获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640658/

相关文章:

c# - Entity Framework 问题 "The table/view ' 没有定义主键。”

c# - 如何在html中设置阿拉伯字符串的顺序

java - JEE7 : best way to create another thread that never exits

java - Thread.start() 和 Thread.run() 有什么区别?

android - Android、Windows Phone 7 和 Blackberry 的等效配置文件 (iOS)

c# - 如何将 3D 加速度转换为旋转?

c# - 如何在不使用Assembly.Load的情况下加载程序集?

c# - MSMQ队列中第一个Message.Body是OK的,后面队列中的Message.Body都是空的

c - 使用邮箱实现线程间通信的问题

sockets - 在 Windows Phone 7 中打开 TCP 连接