Я работаю над созданием службы Windows, которая получает результат JSON от API. Затем он берет эти данные, десериализует их в список объектов. Затем использует информацию из этих объектов для отправки электронной почты.
До сих пор я писал и тестировал его как консольное приложение с помощью метода, описанного здесь: https://social.technet.microsoft.com/wiki/contents/articles/30957.c-windows-service-in. -console-mode-for-debug-and-admin.aspx
Это сработало очень хорошо, и сервис выполнил все, что я хотел. Теперь пришло время превратить его в настоящую службу, установить на мою машину и таким образом протестировать.
Решение строится просто отлично, и установщик тоже работает. После установки, если я пытаюсь запустить службу, я получаю сообщение об ошибке: 1053, и служба зависает как «Запуск». Затем мне нужно удалить и перезагрузить компьютер, чтобы внести какие-либо изменения, и снова собрать его для тестирования.
До сих пор я пробовал:
Мой OnStart:
//prints function we are in to the debug console and sets the service
//status, as well as adds an entry to the event log
Debug.WriteLine("In OnStart.");
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwWaitHint = 100000;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
//eventLog1.WriteEntry("In OnStart.", EventLogEntryType.Information);
Thread t = new Thread(new ThreadStart(MainRunner));
t.Start();
// Update the service state to Running.
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
Основной бегун():
//timer used for evaluating every hour from start time
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new ElapsedEventHandler(this.OnTimer1);
timer.Interval = /*3600000;*/ 60000;// for 1 minute testing
//starts the timer
timer.Start();
DateTime hour = new DateTime(1, 1, 1, 17, 0, 0);
//checks faulty vehicles for the day, everyday at 5pm
while (true) //infinite loop
{
//gets the current DateTime
DateTime Now = DateTime.Now;
//verifies that the current DateTime is 5pm and not a Saturday or Sunday
if (Now.Hour == hour.Hour && Now.Minute == hour.Minute && Now.Second == hour.Second
&& Convert.ToInt32(Now.DayOfWeek) != 0 && Convert.ToInt32(Now.DayOfWeek) != 6)
{
TwenFourHour(); //calls the daily check
//prints to debugger that daily check is done
Debug.WriteLine("Out of TwenFourHour");
//eventLog1.WriteEntry("Out of TwenFourHour", EventLogEntryType.Information);
}
}
УстановитьСтатусСервиса():
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool SetServiceStatus(System.IntPtr handl, ref ServiceStatus serviceStatus);
Это исходит непосредственно от Microsoft здесь: https://learn.microsoft.com/en-us/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer ?redirectedfrom=MSDN
Я уверен, что есть лучшие способы делать то, что я делаю здесь (например, запланированное задание, но это не то, что меня просили), но это то, что я придумал. По сути, мне нужно получать один ответ GET от API каждый час. Это не отправляет электронное письмо. Мне также нужно получить доступ к отдельному ответу GET каждый день в 17:00, это отправляет электронное письмо. Мне также нужно было исключить из этого выходные. Выходные для почасовой проверки обрабатываются в методе таймера.
@DavidG Я добавлю SetServiceStatus к вопросу. Это хороший момент в теме, я забыл это сделать. Тем не менее, проблема точно такая же, как и до добавления темы. Раньше все в MainRunner() находилось в OnStart(), где находится создание/запуск потока.
Я понял проблему.
Это с циклом while. Я удивлен, когда увидел, что это упоминается как метод проверки времени в службе в нескольких сообщениях здесь, но я думаю, что это очень недовольно.
Что я сделал вместо этого, теперь запускаю таймер каждую минуту. Затем таймер сверяется с часами и минутами (игнорируя секунды, так как таймер может быть запущен в любом диапазоне от 0 до 59). Таким образом, он обязательно сработает один раз в пределах 17:00.
Что такое
SetServiceStatus
? Хотя похоже, что что-то поддерживает ваш процесс, когда служба останавливается. Для начала, правильно ли вы заканчиваете начатую нить?