2012-07-19 85 views
1

在我正在處理的項目中,客戶想要將RSS訂閱源合併到他們的網站新聞項目中。異步處理使用MVC的RSS訂閱源

該網站已經有一個由數據庫中提取的NewsItems填充的新聞訂閱源。

我的想法是定期(每20分鐘左右)使用rss訂閱源,但我不確定在訂閱源更新時試圖查看新聞頁面的客戶端會產生什麼樣的影響。

我的想法是使用ThreadPool.QueueUserWorkItem消耗飼料,處理它,並添加新的項目到數據庫/ lucene索引/添加標籤等,但我的異步編程經驗幾乎爲零。

QueueUserWorkItem會生成一個新的線程來執行工作而不會阻塞客戶端線程嗎?更新結束後會發生什麼?

我的想法做這樣的:

public class ExternalRSS 
{ 
    private readonly SettingsDTO Settings; 

    public ExternalRSS() 
    { 
     Settings = Application.FetchSettings(); 

     RunAsynchronously(ProcessFeed); 
    } 

    public static void RunAsynchronously(Action method) 
    { 
     ThreadPool.QueueUserWorkItem(i => 
     { 
      try 
      { 
       method(); 
      } 
      catch (ThreadAbortException ex) { /*log*/} 
      catch (Exception ex){/*log*/} 
     }); 
    } 

    private void ProcessFeed() 
    { 
     if(Settings != null) 
     { 
      using (var reader = XmlReader.Create(Settings.FacebookRssFeed)) 
      { 
       var rssData = SyndicationFeed.Load(reader); 

       //do processing etc 
      } 
     } 
    } 
} 

難道我對這個問題複雜化?

任何意見將受到歡迎!

回答

1

這個恕我直言,不是應該在ASP.NET MVC應用程序內完成的任務。我會使用一個單獨的專用Windows服務,它將定期查詢遠程RSS源並更新數據庫。或者定期使用Windows任務計劃程序定期運行一個簡單的控制檯應用程序。重要的部分是寫入數據庫時​​:確保它在SQL事務中執行。這樣,客戶端MVC應用程序在閱讀時不會看到損壞的數據。

我還建議您閱讀following blog post,其中Phil Haack詳細解釋了爲什麼在ASP.NET應用程序中實現這樣的週期性後臺任務是一個非常糟糕的主意。

+0

嗨達林,我確實考慮過在外部做這件事,但它會使事情稍微複雜化(獲得創建此類任務的權限等)。我會和客戶談談,看看他們能否爲我解決這個問題。 – 2012-07-19 15:11:09

+0

嗯,我得到了客戶爲該網站購買VPS,所以現在我有充分的權限來做我所需要的 - 所以這段代碼將作爲一個服務箱運行。 – 2012-07-23 08:10:31