2009-05-27 80 views
2

我想同时监控多个网页/ rss订阅源,并以固定频率轮询它们(它们可能都有不同的更新频率)。我正在考虑为每个我想要镜像的源创建一个线程,这个线程将无限循环,然后在处理获取的数据之后进入下一次更新。监控多个网页/ rss订阅

有人应该有一个更好的主意或如何做到这一点的例子吗?

回答

0

使用计时器踢每个1(或5)分钟。在定时器回调中,循环通过需要检查的URL,并验证它们是否由于被检查(如放入注释中,它们将具有不同的同步时间)。你可以准备一个合适的结构来保存网址和超时时间,以及上次的时间。

如果一个url可以同步(时间已过),请启动一个异步HttpWebRequest来获取它。这样,你将所有的接收部分卸载到一个线程池线程,所以它不会影响你的主定时器回调线程。要小心 - 如果你对响应做了大量的处理,你可能需要在HttpWebRequest回调中启动常规线程来做额外的处理,或者实现某种类型的队列,所以你尽快释放线程池线程可能。

这里是一个很好的解释如何使异步请求:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic23172.aspx

您可以谷歌更多的例子为好,但这是一个好的开始。

+0

我没有想到计时器,其实都是静好(和到目前为止所有的答案做广告),但来源不应该总是在同一个频率或在同一时间更新。 – Dave 2009-05-27 16:24:44

+0

你没有说每个资源都会有它自己的超时。但仍然 - 你可以有很多计时器 - 尝试在一个具有类似超时的计时器中分组许多资源。另外,如果您要对响应进行大量处理,则不要在异步请求的回调中执行此操作,而应该启动线程来处理结果,以便足够快地释放线程池线程。 – 2009-05-27 16:28:52

0

为什么不只是在一个时钟上同步它,比如让它们在每个小时(10,20,30等)中都更新10次,而不是在10分钟内随机更新所有线程。为什么你需要为每个页面/ feed创建一个线程?

0

使用Timer对象使用BackgroundWorkerThread对象触发进程,以便可以在后台处理事物。根据您拥有的数量,您可能会考虑在较短的时间间隔内进行“交错”更新。每5分钟说一次,工作线程启动,转到饲料列表中的下一个饲料以监视并检查更新。

正如我确信您从某些供稿阅读器看到的那样,立即更新所有供稿并不总是最好的解决方案,因为它可能会冻结用户界面。

0

我创建了一个窗口服务来完成你正在描述的内容。每n分钟,守护进程就会醒来,读取一个需要获取的URL的XML文件,处理所有数据并再次进入睡眠n分钟。我有一个线程用于获取数据,另一个用于监视XML文件的更改。 XML文件可以通过Web界面进行更新。

正如yx所指出的那样,没有必要在每个页面创建一个线程,但是,如果您有很多url需要,可以将您的url分发到100个包中(例如),然后创建一个线程每个包。然后您必须等待最后一个线程完成后才能再次发送守护程序。

-1

对于每个源的一个线程是一个矫枉过正的开始,其次睡眠线程浪费宝贵的内存。线程数量>内核数量是不合理的,除非你有数据支持他们所有人(或大多数人)都会有一些工作。当你决定线程不要尝试assing目的,任何线程数,在未来的发展意味着有人

一个多考虑想要做的10个更多的东西,他会增加10多个线程每一件事情。这样,您就可以查看任务管理器很多设计糟糕的应用程序是如何创造如此多线程(每个线程=内存+附加资源猪1MB)可能是您的RAM 1GB只是被撞了,因为这么多线程的创建,并没有真正做任何有用的事并且大部分时间都在睡觉。这就是为什么Threadpool或Async IO是在需要时重用系统线程并在多个应用程序之间共享的方法。

以下是我的想法,我将有一个线程或计时器继续运行(并在需要时进行休眠),然后进行异步调用(而不是阻止一次调用)或将Threadpool上的每个调用排队到所有刷新刷新周期的来源(如果真的需要,可能会在很短的时间内进入睡眠状态)。

更多信息上Asynchronous IO & Threadpool