Windows服务和多线程
问题描述:
我工作在一个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
}
}