【问题标题】:Windows Service + read from databaseWindows 服务 + 从数据库读取
【发布时间】:2011-09-29 07:32:51
【问题描述】:

我是 Windows 服务的新手。我需要一个从数据库表中读取条目的 Windows 服务。我有一个控制台应用程序,我在其中添加了新项目 WINDOWS SERVICE。我已经有一个访问数据库的方法和其他方法。我可以启动一个线程来读取数据库。我把线放在哪里? ( 我怎样才能做到这一点)。我在 WINDOWS SERVICE 的哪个位置添加了这些方法?我有这样的 Windows 服务:

public Service1()
{
   InitializeComponent();
}

protected override void OnStart(string[] args)
{
   do
   {
      thread.start();
      bool variab = readFromDatabase (Database table);
   }
}

protected override void OnStop()
{
}

【问题讨论】:

    标签: c# database windows-services database-schema


    【解决方案1】:

    我建议你创建一个类,在其中做你需要的一切并在服务中创建:

    public Service1()
        {
            InitializeComponent();
        }
    
        protected override void OnStart(string[] args)
        {
            YourClass cl = new YourClass();
            cl.DoWhatYouNeed(...);       
        }
    
        protected override void OnStop()
        {
        }
    

    这让您有机会独立于服务运行和测试您的类,可能在调试发布期间。

    【讨论】:

      【解决方案2】:

      对于 Windows 服务,通常会在一个单独的线程中创建一个方法来执行服务的主循环。否则服务可能会变得无响应。例如,您可以有一个名为 MainLoop 的方法来执行服务逻辑。 OnStart 方法仅用于执行初始化任务,例如读取配置值或启动服务的线程。并使用 OnStop 执行清理任务、停止线程等...

      Thread _workerThread;
      bool _shouldStop;
      
      public Service1()
      {
        InitializeComponent();
      }    
      
      protected override void OnStart(string[] args)
      {
         try{
         _workerThread = new Thread(new ThreadStart(MainLoop));
         _shouldStop = false;
         _workerThread.Start();
         }
         catch{}
      }
      
      private void MainLoop()
      {
         while (!_shouldStop)
         {
            try{
            //your logic here
            }
            catch{}
         }
      }
      
      protected override void OnStop()
      {
         _shouldStop = true;
      }
      

      【讨论】:

      • 空捕获块(通常)是邪恶的。在 OnStart() 方法中,它们尤其重要。在您的情况下,服务控制管理器会认为您的服务已经启动,而它可能永远无法启动您的“MainLoop”。也许它就是你想要的,但我会怀疑。
      • 它们是空的,因为它是一个示例,示例的目的不是异常处理。我不是在这里写应用程序,只是展示每种方法的用途。关于MainLoop,在OnStart方法的异常处理中会决定是否停止服务,所以是的,是有意的。
      【解决方案3】:

      您必须将包含数据访问逻辑的代码或类放在 OnStart 方法中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多