Служба Windows и подключение к базе данных

(Я новичок в службах Windows) У меня есть автоматическая служба Windows, которая извлекает некоторые записи из таблицы базы данных, вызывает метод веб-службы для каждой записи и вставляет возвращаемое значение метода и некоторую другую информацию в таблицу. Мои проблемы перечислены ниже:

1- Когда я пытаюсь запустить службу вручную, я получаю Error 1053 (the service did not respond to the start or control request in a timely fashion). Кстати, несмотря на ошибку, служба запускается и делает то, что должна.

2- (Я знаю, что это распространенная проблема, но я предпочитаю задать ее еще раз) Служба работает автоматически, но зависит от подключения к базе данных. Когда система, в которой работает служба, перезагружается, мне пришлось запускать ее вручную. Я добавляю Thread.Sleep() строку кода, чтобы избежать этой проблемы. Каков реальный способ решения проблемы?

protected override void OnStart(string[] args)
    {
        checkRegistryForOracleNLS();

        //Creating event log
        plog = new System.Diagnostics.EventLog();
        if (!System.Diagnostics.EventLog.SourceExists("Prov"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Prov", "ProvLog");
        }
        plog.Source = "Prov";
        plog.Log = "ProvLog";
        plog.Clear();
        Log("Service started at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);

        class_ora_tran.int_class_ora_tran();
        DataTable dt;

        Thread.Sleep(300000); 

        while (true)
        {
            Con2DB();
            if (class_ora_tran.dbConnected())
            {
                RemoveOldRecords();
                dt = FetchRec();
                if (dt != null)
                {
                    if (dt.Rows.Count > BLKSize)
                        Bulk(dt);
                    else
                        Single(dt);
                }
            }
        }   
    }

3- Хотя я написал метод OnStop(), нет функции Stop, когда служба запущена, и я хочу ее остановить. Я также должен упомянуть, что моя служба всегда находится в режиме «Запуск» и никогда не переходит в «Запущен».

Protected void OnStop(string[] args)
    {
        class_ora_tran.Disconnect();
        Log("Service stoped at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);
        plog.Close();
    }

4- Время от времени, хотя статус начинается, моя служба перестает делать то, что должна делать, и не извлекает записи из таблицы. Это случалось два раза раньше, к сожалению, я забыл проверить Event Viewer, чтобы увидеть, не произошли ли какие-то ошибки. кто-нибудь знает в чем причина? Связано ли это с проблемами, о которых я говорил выше?

5- Каждый раз, когда я хочу удалить службу, мне приходилось запускать команду удаления два раза! Любая помощь?

Редактировать: записи вставляются в таблицу состязательно, и процесс вызова веб-службы и т. д. должен выполняться каждый раз, когда в таблицу вводится новая запись. Я думал, что нужен цикл While(true). Есть предложения по замене этой детали?


person Narges    schedule 22.02.2014    source источник
comment
while (true) --› это довольно тревожно, особенно то, что я не вижу break;   -  person T.S.    schedule 22.02.2014
comment
это важно, я хочу, чтобы сервис постоянно запускал эту часть кода.   -  person Narges    schedule 22.02.2014
comment
Это ужасный способ сделать сервис   -  person T.S.    schedule 22.02.2014
comment
Есть ли у вас какие-либо другие предложения, чтобы сделать то, что я хочу сделать? Я так новичок в услугах.   -  person Narges    schedule 22.02.2014
comment
Лучший способ - служба слушает порт и просыпается только тогда, когда получает сообщение о начале обработки существующего задания. Распространенным способом является установка таймера и периодическая проверка заданий. Первый способ не слишком сложный, но более сложный. Второе банально. Вы должны запустить свою службу onStart и запустить таймер. В onStart не должно быть никакого логического выполнения   -  person T.S.    schedule 22.02.2014
comment
Не могли бы вы показать мне пример кода?   -  person Narges    schedule 22.02.2014
comment
Спасибо. что вы имеете в виду, что я устанавливаю таймер и выполняю процесс в конце каждого интервала?   -  person Narges    schedule 22.02.2014
comment
да. Когда вы обнаруживаете задание и обрабатываете все задания в очереди; вы можете остановить таймер и обработать задание. Затем перезапустите таймер. Я написал одну временную службу, которая динамически меняет интервал таймера в зависимости от количества заданий. Когда появлялись задания, таймер срабатывал чаще, когда заданий было мало, он переходил в спящий режим, поэтому он не сильно ударил по БД из-за малого. Вот сервис слушателя codeproject.com/Articles/ 5733/A-TCP-IP-Server-writing-in-C Я уверен, что как только вы очистите свой while(true), ваша служба будет работать намного лучше.   -  person T.S.    schedule 22.02.2014
comment
Ваш onStart должен быть освобожден от любой ответственности, кроме инициализации, такой как чтение файла конфигурации и т. д. Вы никогда не заканчиваете свой onStart, а затем пытаетесь запустить OnEnd :o))   -  person T.S.    schedule 22.02.2014
comment
Спасибо @TS.. У меня проблема в том, что количество записей, вставленных в таблицу, меняется во времени. Некоторое время у меня есть более 1 миллиона записей, вставленных в таблицу одновременно. Ваш подход и использование динамических интервалов справятся с этой ситуацией?   -  person Narges    schedule 22.02.2014
comment
Забудьте пока о динамических интервалах. Переместите свою обработку на подход, основанный на таймере. Затем вы можете регулировать количество обрабатываемых записей и т. д. Служба обычно состоит из двух логических частей - 1. Рабочий процесс службы; 2. Фактическое выполнение заданий. Сейчас вам нужно изменить свой рабочий процесс. Затем вы будете измерять производительность и т. д., и вы сможете настроить свой рабочий процесс в соответствии с потребностями.   -  person T.S.    schedule 22.02.2014
comment
@Narges Попробуйте запустить службу каждые x минут. Я добавил ссылку, которая, я думаю, удовлетворит ваши потребности.   -  person Dexters    schedule 22.02.2014
comment
Также у этой программы есть большая проблема с истечением времени Thread.Sleep 50 минут = 300 000 миллисекунд, что делает ее невосприимчивой, когда поток переходит в этот статус. Вероятно, поэтому служба не отвечает на команду «Стоп».   -  person YeinCM-Qva    schedule 04.08.2017


Ответы (1)


Я выдвину некоторые предложения для вашей службы.

  1. Сделайте так, чтобы ваш сервис запускался вручную. Поэтому, как только вы установите службу, вы просто запустите ее вручную только один раз.
  2. После того, как вы начнете, у вас есть несколько хороших вариантов для запуска вашей логики.

    . Выполнять каждые X минут http://www.codeproject.com/Questions/540617/windowsplusserviceplustoplusrunpluseveryplusoneplu

    . Запускайте каждый день в чч:мм службу Windows для запуска функции в указанное время. время . Беги немедленно

  3. Поместите свой код в функцию и вызовите эту функцию в функции Timer_Elapsed(), которую вы когда-либо выбирали в приведенных выше примерах ссылок.

  4. Используйте OnStart для настройки информации о таймере, чтения файлов конфигурации и т. д.

  5. Попробуйте удалить службу с помощью программы «Установка/удаление» Windows. (создайте установщик msi для установки службы. Сохраняет ваши командные строки) Как создать установщик для службы Windows .net с помощью Visual Studio

person Dexters    schedule 22.02.2014
comment
Не могу настроить запуск вручную. Система, на которой он работает, часто перезагружается, и я не единственный пользователь, работающий с ним. Я также не могу заставить его работать в точное время каждый день, то, что он должен делать, является непосредственной задачей. Спасибо за остальную часть ответа, я попробую то, что вы предлагаете. - person Narges; 22.02.2014
comment
@Narges, вы можете поиграть со свойствами и проверить, а также получить некоторую помощь ethertubes.com/make-a-program-run-as-a-windows-service-on-boot. Можно использовать и автоматический. Или вы можете написать исполняемый файл, чтобы убедиться, что ваша служба работает при перезагрузке, если она не запускается. Вы можете искать команды SC или WMIC .. Просто к вашему сведению, чтобы вас сильно не запутать. - person Dexters; 22.02.2014