Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 Windows服务与多线程_C# 4.0_Windows Services - Fatal编程技术网

C# 4.0 Windows服务与多线程

C# 4.0 Windows服务与多线程,c#-4.0,windows-services,C# 4.0,Windows Services,我在一个Windows服务上工作,我想在其中有两个线程。一个线程应该查找更新(在RSS提要中),并在发现更新时将行插入数据库 当发现更新时,我希望通过另一个线程发送通知,该线程访问数据库,获取消息和收件人,然后发送通知 也许最好的做法不是使用两个线程。我应该在两个线程中都有db连接吗 有谁能给我一些解决这个问题的建议吗 使应用程序或服务多线程化的主要原因是执行数据库或其他后台操作,而不阻塞(即挂起)Windows窗体之类的表示元素。如果您的服务依赖于非常快速的轮询,或者期望db插入花费很长时间,

我在一个Windows服务上工作,我想在其中有两个线程。一个线程应该查找更新(在RSS提要中),并在发现更新时将行插入数据库

当发现更新时,我希望通过另一个线程发送通知,该线程访问数据库,获取消息和收件人,然后发送通知

也许最好的做法不是使用两个线程。我应该在两个线程中都有db连接吗


有谁能给我一些解决这个问题的建议吗

使应用程序或服务多线程化的主要原因是执行数据库或其他后台操作,而不阻塞(即挂起)Windows窗体之类的表示元素。如果您的服务依赖于非常快速的轮询,或者期望db插入花费很长时间,那么使用两个线程可能是有意义的。但我无法想象你的情况会是这样

如果您确实决定让您的服务成为多线程的,那么您要研究的C#中的两个主要类是和。如果您想要执行多个并发db插入(例如,如果您想要为同时轮询的多个RSS提要中的每一个执行插入),则应该使用线程池。否则,请使用BackgroundWorker

通常,您会有一个db访问类,该类将有一个插入行的方法。该方法将创建一个后台工作程序,将DoWork处理程序添加到该db访问类中的某个静态方法,然后调用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
    }
}