我工作在一個Windows服務,我想有兩個線程。一個線程應該查找更新(在RSS源中)並在發現更新時將行插入到數據庫中。Windows服務和多線程
當發現更新時,我想通過另一個線程發送通知,該線程訪問數據庫,獲取消息和收件人,然後發送通知。
也許最好的做法是不要使用兩個線程。我應該在兩個線程都有db連接嗎?
任何人都可以提供如何解決這個問題的提示嗎?
我工作在一個Windows服務,我想有兩個線程。一個線程應該查找更新(在RSS源中)並在發現更新時將行插入到數據庫中。Windows服務和多線程
當發現更新時,我想通過另一個線程發送通知,該線程訪問數據庫,獲取消息和收件人,然後發送通知。
也許最好的做法是不要使用兩個線程。我應該在兩個線程都有db連接嗎?
任何人都可以提供如何解決這個問題的提示嗎?
使多線程應用程序或服務的主要原因是執行數據庫或其他後臺操作,而不會阻塞(即掛起)像Windows窗體一樣的表示元素。如果您的服務取決於非常快速的輪詢或預計db插入需要很長時間,那麼使用兩個線程可能是有意義的。但我無法想象在你的情況下,情況會如此。
如果你決定讓你的服務多線程化,那麼你想要查看的C#中的兩個主要類是BackgroundWorker和ThreadPool。如果要執行多個併發數據庫插入(例如,如果要針對同時輪詢的多個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
}
}