Служба Windows + чтение из базы данных - PullRequest
0 голосов
/ 29 сентября 2011

Я новичок в службе 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()
{
}

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Я предлагаю вам создать класс, в котором вы делаете все, что вам нужно, и создаете в сервисе:

public Service1()
    {
        InitializeComponent();
    }

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

    protected override void OnStop()
    {
    }

Это дает вам возможность запускать и тестировать свой класс отдельно от службы, возможно, во время выпуска отладки.

1 голос
/ 29 сентября 2011

В службах 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;
}
0 голосов
/ 29 сентября 2011

Вы должны поместить свой код или класс, которые содержат логику доступа к данным, в метод OnStart

...