2009-05-27 79 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