Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сервис работающий не все время

9.4K
22 ноября 2007 года
vitalik_4
37 / / 12.11.2006
Подскажите как реализовать седующее. Есть база данных надо сделать сервис который бы копировал из нее записи
начиная с заданого ID т.е.:
1) проверил есть ли свежие записи в БД если ДА - п.2 НЕТ - п6
2) скопировал 10 тыс. записей
3) сохранил ID последней скопированой записи
4) прошло 10 секунд (например)
5) п.1
6) нифига не делать

А у меня получается что сервис что-то делает постоянно:( . Вот исходник ( код OnStart, OnStop, cpy - писал не сам, взял из примера и
переделал под свою задачу, поэтому разбираюсь в нем очень приблизительно, если можно объясните пожалуйста где тут
чаво). Я так понимаю при старте сервиса создается поток выполняющий функцию cpy которая в бесконечном цикле по исечении
определенного интервала вызывает уже непосредственно мою функцию. Или нет :confused: ? Пожалуйста помогите разобраться и
направьте на путь истинный, сервис пишу первый раз, соотвественно поэтому и такие вопросы.
Код:
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тыс записей
      закрываем обе БД*/     
   
    }

}

[color=red]Для оформления кода используй теги. Модератор. [/color]
370
22 ноября 2007 года
koval
443 / / 29.08.2005
На первый взгляд могу сказать только:
 
Код:
protected override void OnStop()
{
[color=red]mre.WaitOne[/color]//mre.Set();
tr.Join(10000);
mre.Set();
base.OnStop();
Log("остановлен");
// сохохраняем ID последней записи
}


т.е. приостанавливаем поток, а через 10 сек опять его стартуем.
Попробуй так. Мне кажется, что ты неправельно останавливаешь поток.
5
22 ноября 2007 года
hardcase
4.5K / / 09.08.2005
Дело в том, что сервис отлаживать проблематично.
Потому используют технику оберток и поступают так: создается собственный класс, реализующий логику сервиса, в нем пишется весь код, относящийся к OnStart, OnStop, OnPause и прочим.
Далее создается простое Windows-пиложение с 3 кнопками управления сервисом: Start, Stop, Pause. Сервис спокойно отлаживается. Отлаженный код элементарно обертывается ServiceBase'ом и устанавливается в винде. Все.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог