public partial class Service1 : ServiceBase
{
protected Thread tr;
protected TimeSpan delay;
protected ManualResetEvent mre;
public Service1()
{
InitializeComponent();
TimeSpan delay = new TimeSpan(0, 0, 0, 10, 0);
}
protected override void OnStart(string[] args)
{
Log("Запущен");
ThreadStart start = new ThreadStart(this.cpy);
mre = new ManualResetEvent(false);
tr = new Thread(start);
tr.Start();
base.OnStart(args);
}
protected override void OnStop()
{
mre.Set();
tr.Join(10000);
base.OnStop();
Log("остановлен");
// сохохраняем ID последней записи
}
protected void cpy()
{
bool sign = false;
while (true)
{
sign = mre.WaitOne(delay, true);
if (sign == true) break;
CopyToTMP(); // вызов процедуры копирующей данные
}
}
protected void CopyToTMP()
{/*открываем одну БД, берем 10 тыс. записей,
открываем вторую БД, вставляем туда 10тыс записей
закрываем обе БД*/
}
}
сервис работающий не все время
начиная с заданого ID т.е.:
1) проверил есть ли свежие записи в БД если ДА - п.2 НЕТ - п6
2) скопировал 10 тыс. записей
3) сохранил ID последней скопированой записи
4) прошло 10 секунд (например)
5) п.1
6) нифига не делать
А у меня получается что сервис что-то делает постоянно:( . Вот исходник ( код OnStart, OnStop, cpy - писал не сам, взял из примера и
переделал под свою задачу, поэтому разбираюсь в нем очень приблизительно, если можно объясните пожалуйста где тут
чаво). Я так понимаю при старте сервиса создается поток выполняющий функцию cpy которая в бесконечном цикле по исечении
определенного интервала вызывает уже непосредственно мою функцию. Или нет :confused: ? Пожалуйста помогите разобраться и
направьте на путь истинный, сервис пишу первый раз, соотвественно поэтому и такие вопросы.
Код:
[color=red]Для оформления кода используй теги. Модератор. [/color]
Код:
protected override void OnStop()
{
[color=red]mre.WaitOne[/color]//mre.Set();
tr.Join(10000);
mre.Set();
base.OnStop();
Log("остановлен");
// сохохраняем ID последней записи
}
{
[color=red]mre.WaitOne[/color]//mre.Set();
tr.Join(10000);
mre.Set();
base.OnStop();
Log("остановлен");
// сохохраняем ID последней записи
}
т.е. приостанавливаем поток, а через 10 сек опять его стартуем.
Попробуй так. Мне кажется, что ты неправельно останавливаешь поток.
Потому используют технику оберток и поступают так: создается собственный класс, реализующий логику сервиса, в нем пишется весь код, относящийся к OnStart, OnStop, OnPause и прочим.
Далее создается простое Windows-пиложение с 3 кнопками управления сервисом: Start, Stop, Pause. Сервис спокойно отлаживается. Отлаженный код элементарно обертывается ServiceBase'ом и устанавливается в винде. Все.