2011-06-06 96 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 
    } 
}