Я работал над многими приложениями, которые работают как сервис окон или запланированные задачи.
Теперь, я хочу удостовериться, что эти приложения будут отказоустойчивы и надежны. Например; у меня есть сервис, который работает каждый час. если сервис отказывает, в то время как его работа или выполнение, я хотел бы, чтобы приложение работало снова в течение того же периода (существует несколько вещей, связанных с этим включая транзакции обработки данных), для предотвращения потери данных. кроме того, я хотел бы, чтобы программа сообщила об ошибке с деталями. Моя цель состоит в том, чтобы избежать потери данных и не отстающий для того, чтобы запустить программу.
Я создал библиотеку классов, которую пользователь может импортировать в проект. Библиотека, как предполагается, хранит информацию рабочего экземпляра программы, т.е. чтения программы и информацию о записях рабочего интервала, рабочее состояние и т.д. Эти данные хранятся в базе данных.
Мне было любопытно, если существуют некоторые лучшие практики для создания запланированных задач / сервисы окон отказоустойчивый и надежный.
Редактирование: Я говорю о независимых задачах или сервисах который на различных серверах. и моя цель состоит в том, чтобы удостовериться, что сервис будет продолжать управлять, сообщать о любых отказах и восстанавливаться от них.
Мне интересно, что говорят другие люди, но я дам вам несколько моментов, на которые наткнулся:
Создайте обработчик событий для необработанных исключений. Таким образом, вы можете очистить ресурсы, записать в файл журнала, отправить электронное письмо администратору или сделать что-нибудь, что вам нужно, вместо того, чтобы сбой.
AppDomain.CurrentDomain.UnhandledException + = new UnhandledExceptionEventHandler (AppUnhandledExceptionEventHandler);
Переопределите любые обработчики событий сервисной базы, которые вам нужны в основной части вашего приложения. OnStart и OnStop очень важны, но есть много других, которые вы можете использовать. http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx
Остерегайтесь таймеров. Таймеры форм Windows не будут работать правильно в службе. Пользователь System.Threading.Timers или System.Timers.Timer. Лучший таймер для использования в службе Windows
Если вы обновляетесь в потоке, убедитесь, что вы используете блокировку () или монитор в ключевых разделах, чтобы убедиться, что все является потокобезопасным.
Будьте осторожны, чтобы не использовать что-либо специфическое для пользователя, поскольку служба работает без определенного пользовательского контекста. Я заметил, что некоторые из моих строк подключения SQL больше не работают для авторизации Windows и т. Д. Также я слышал, что у людей возникают проблемы с подключенными дисками.
Никогда не создавайте услуги с пользовательским интерфейсом. Фактически, для Vista и 7 это практически невозможно сделать. Это не должно требовать взаимодействия с пользователем, максимум, что вы можете сделать, - это отправить сообщение с помощью функции WIN32. MSDN утверждает, что создание интерактивных сервисов - плохая практика. http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx
В целях отладки неплохо запустить службу как консольное приложение, пока вы заставить его делать то, что вы хотите. Замечательный учебник: http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html
В любом случае, надеюсь, что это немного поможет, но это всего лишь пара вещей, которые я пытался найти самостоятельно.
Что-то очевидное - не запускайте все задачи одновременно. Старайтесь планировать их так, чтобы только одна задача использовала какой-то дорогой ресурс в любое время (если это возможно). Например, если вам нужно рассылать информационные бюллетени и некоторые специфические уведомления, запланируйте их на разное время. Если две задачи должны очистить что-то в базе данных, пусть одна выполняется после другой.
Также запланируйте выполнение задач в нерабочее время - очевидно, ночью.