2011-06-06 108 views
1

我工作在一個Windows服務,我想有兩個線程。一個線程應該查找更新(在RSS源中)並在發現更新時將行插入到數據庫中。Windows服務和多線程

當發現更新時,我想通過另一個線程發送通知,該線程訪問數據庫,獲取消息和收件人,然後發送通知。

也許最好的做法是不要使用兩個線程。我應該在兩個線程都有db連接嗎?

任何人都可以提供如何解決這個問題的提示嗎?

回答

2

使多線程應用程序或服務的主要原因是執行數據庫或其他後臺操作,而不會阻塞(即掛起)像Windows窗體一樣的表示元素。如果您的服務取決於非常快速的輪詢或預計db插入需要很長時間,那麼使用兩個線程可能是有意義的。但我無法想象在你的情況下,情況會如此。

如果你決定讓你的服務多線程化,那麼你想要查看的C#中的兩個主要類是BackgroundWorkerThreadPool。如果要執行多個併發數據庫插入(例如,如果要針對同時輪詢的多個RSS源中的每一個執行插入操作),則應使用ThreadPool。否則,請使用BackgroundWorker。

通常,你會有一個db訪問類,它會有一個方法來插入一行。該方法將創建一個後臺工作器,將DoWork處理器添加到該數據庫訪問類中的某個靜態方法到後臺工作器,然後調用DoWorkAsync。您應該只在該類中使用db連接設置,以便更輕鬆地維護代碼。例如:

public static class DbAccess 
{ 
    public void InsertRow(SomeObject entity) 
    { 
     BackgroundWorker bg = new BackgroundWorker(); 
     bg.DoWork += InsertRow_DoWork; 
     bg.RunWorkerCompleted += InsertRow_RunWorkerCompleted; 
     bg.RunWorkerAsync(entity); 
    } 

    private void InsertRow_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker bg = sender as BackgroundWorker; 
     SomeObject entity = e.Argument as SomeObject; 

     // insert db access here 
    } 

    private void InsertRow_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     // send notifications 
     // alternatively, pass the InsertRow method a 
     // delegate to a method in the calling class that will notify 
    } 
}