Не работает служба Windows c#
Была следующая задача. Сделать службу Windows, которая прослушивает таблицу базы данных и при добавлении новой строки добавляет файл в определенную директорию. Проблема заключается в том, что при запуске службы через пару секунд он останавливается сам. Код класса ChangeWatcher:
class ChangeWatcher
{
public string message = "";
private string connectionString = "Data Source=DESKTOP-K0V0O3J\\SQLEXPRESS;Initial
Catalog=Store;Integrated Security=SSPI;User ID = sa; Password =;";
public void startWatching()
{
SqlDependency.Start(connectionString);
ExecuteWatchingQuery();
}
public void stopWatching()
{
SqlDependency.Stop(connectionString);
}
private void ExecuteWatchingQuery()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(
"select Id, Name from dbo.products", connection))
{
var sqlDependency = new SqlDependency(command);
sqlDependency.OnChange += new OnChangeEventHandler(OnDatabaseChange);
command.ExecuteReader();
}
}
}
private void OnDatabaseChange(object sender, SqlNotificationEventArgs args)
{
SqlNotificationInfo info = args.Info;
if (SqlNotificationInfo.Insert.Equals(info))
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(
"select top 1 Id, Name from dbo.products order by ID desc", connection))
{
SqlDataReader rd = command.ExecuteReader();
while (rd.Read())
{
message += rd[0] + "\t";
message += rd[1] + "\n";
}
}
}
string path = "C:\\Users\\Lenovo\\Desktop\\Паттерны\\DatabaseChanges.txt";
using (StreamWriter sw = new StreamWriter(path, false, System.Text.Encoding.Default))
{
sw.WriteLine(message);
}
}
ExecuteWatchingQuery();
}
}
код класса Service1:
public partial class Service1 : ServiceBase
{
ChangeWatcher watcher;
public Service1()
{
InitializeComponent();
this.CanStop = true;
this.CanPauseAndContinue = true;
this.AutoLog = true;
}
protected override void OnStart(string[] args)
{
watcher = new ChangeWatcher();
Thread watcherThread = new Thread(new ThreadStart(watcher.startWatching));
watcherThread.Start();
}
protected override void OnStop()
{
watcher.stopWatching();
Thread.Sleep(1000);
}
}
проверил класс ChangeWatcher в консольном приложении и он работает. Не знаю в чем проблема. Буду очень благодарен за помощь!!!
Ответы (1 шт):
Автор решения: Aziz Umarov
→ Ссылка
Интересно, вы не слушаете изменения вы про100 запускаете сервис в котором поток выполняет один раз watcher.startWatching или
connection.Open();
using (var command = new SqlCommand("select Id, Name from dbo.products", connection))
{
var sqlDependency = new SqlDependency(command); // создаете объект
sqlDependency.OnChange += new OnChangeEventHandler(OnDatabaseChange); // байнд метод
command.ExecuteReader(); // выполняете команду
} // команда закончилась до свидания, удаляются всё
// где поток или объект который будет слушать изменения