Если вам нужно что бы сервер периодически выполнял действия, то вам для этого подойдет Windows службы (или scheduler, но речь не о нем) . Создания службы, очень простой процес, для этого необходимо выполнить следующие действия:
- Создайте проект WindowsService.
- В конструкторе выберите Service1. Затем в окне Свойства присвойте свойству ServiceName и свойству (Name) компонента Service1 значение MyNewService
- Для работы из службой используються два метода: OnStart и OnStop
- Приложение службы предназначено для долговременного выполнения. Соответственно, оно обычно опрашивает или отслеживает что-либо в системе. Отслеживание настраивается в методе OnStart. Тем не менее, метод OnStart не отвечает за фактическое отслеживание. После начала работы службы метод OnStart должен возвращать управление операционной системе. Он не должен уходить в бесконечный цикл или блокироваться. Для создания простого механизма опроса можно воспользоваться компонентом System.Timers.Timer. В методе OnStart можно задать параметры компонента и установить значение true для свойства Enabled. Таймер будет выполнять периодическую генерацию событий, при возникновении которых служба сможет вести отслеживание.
- Тобто создаем два (общето можно и одни если не нужно зацыкливать процесс) обекта " private System.Timers.Timer OurTimer; " и " private bool IsWorkThread = false; " . Первый это таймер, второй будет делать вечный цыкл. (Эти переменые создаються как поля класса, т.е. НЕ в методе)
- После этого метод старт будет иметь код
protected override void OnStart(string[] args){
IsWorkThread = true; //Переменная для вечного цикла (может не понадобиться)
int period = 1000;//Через какое время будет срабатывать таймер (1000 - это 1 секунда)
this.OurTimer = new System.Timers.Timer();
this.OurTimer.Interval = period;
this.OurTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.OurTimer_Tick);
this.OurTimer.AutoReset = false;//Если нужен вечный цикл, то устанавливаем это свойство как false, что будет означать что таймер сработает только один раз. Если вечный цикл не нужен то установить в true
this.OurTimer.Start();
}
OurTimer_Tick - это функция где будет основной код.
- В методе стоп, будем останавливать наш процесс :
protected override void OnStop() {
IsWorkThread = false;
if (OurTimer != null) {
OurTimer.Enabled = false;
}}
- Осталося еще пример функции для таймера OurTimer_Tick :
private void OurTimer_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
while (IsWorkThread) //Вечный цикл ( это очень плохой пример цикла)
{
try
{
//Что-то делаем
}
catch (Exception ex)
{
IsWorkThread = false;
}
}
}
- На этом все программирование заканчиваться, остаеться настроить службу для установки. Для этого в обозревателе решений(Solution Explorer) щелкните правой кнопкой Service1.vb, Service1.cs или Service1.jsl и выберите команду Просмотреть конструктор(View Designer).
- Щелкните фон конструктора, чтобы выбрать саму службу, а не какой-либо из ее элементов.
- Щелкните правой кнопкой мыши в активном окне конструктора и выберите команду Добавить установщик (Add Installer). По умолчанию в проект добавляется класс компонента, содержащий два установщика. Компоненту присваивается имя ProjectInstaller, а содержащиеся в нем установщики предназначаются для установки службы и связанного со службой процесса.
- В режиме Конструктор для ProjectInstaller выберите ServiceInstaller1 или serviceInstaller1
- В окне Cвойства(Properties) задайте значение MyNewService для свойства ServiceName.
- Задайте свойству StartType значение Automatic.
- В конструкторе выберите ServiceProcessInstaller1 (для проекта на Visual Basic) или serviceProcessInstaller1 (для проекта на Visual C# или Visual J#). Задайте свойству Account значение LocalService. Это приведет к установке и выполнению службы с использованием локальной учетной записи служб. Учетная запись LocalService действует как пользователь, не имеющий прав на локальном компьютере, и предоставляет учетные данные для анонимного доступа к любому удаленному серверу. Другие учетные записи следует использовать с осторожностью, поскольку они имеют более полные права доступа и увеличивают риск атак, исходящих от злонамеренного кода.
- Дальше нужно создать красивый Install программу. В обозревателе решений(Solution Explorer) правой кнопкой щелкните решение, выберите пункт Добавить(Add) и команду Создать проект(New Project).
- Дальше выбираем "Other Project Types" -> "Setup and Deployment" ->"Setup Project". Пусть название будет MyServiceSetup
- В обозревателе решений щелкните правой кнопкой мыши элемент MyServiceSetup, наведите указатель на пункт Добавить и выберите Выходной элемент проекта (Project Output).
- В окне Проект будет выбран элемент MyNewService
- Выберите из списка элемент Основные выходные файлы (Primary Output) и нажмите кнопку ОК. В установочный проект будет добавлен элемент проекта, соответствующий основным выходным файлам MyNewService.
- В обозревателе решений(Solution Explorer) щелкните правой кнопкой мыши проект установки, наведите указатель на пункт Вид(View) и выберите Настраиваемые действия(Custom Actions).
- В редакторе настраиваемых действий(Custom Actions ) щелкните правой кнопкой узел Настраиваемые действия(Custom Actions) и выберите команду Добавить настраиваемое действие(Add Custom Action).
- Дважды щелкните пункт Папка приложения(Application Folder) в списке, чтобы открыть его, выберите Основные выходные файлы для MyNewService (Primary Output from MyNewService (Active))и нажмите кнопку ОК. Во все четыре узла настраиваемых действий (Установить, Зафиксировать, Отменить и Удалить) будут добавлены основные выходные файлы проекта.
- Делаем Reblid проекту-инстала, и setup.exe ждет вас в папке Debug. (Этот файл производит установку и удаление сервиса. Но он работает только со своей версией билда, если Вы поменяли код, но забыли с компа удалить старый сервис, то могут возникнут проблемы при его удалении. Для такого есть папка Release, куда я копирую последний использованный setup.exe).
- Для запуска сервиса, нужно нажать правой клавишей мышки на иконки "Мой копмьютер", выбрать меню "Управление". В появившемся окне ищем "Службы" и в этом списке свою службу, запускаем.
Одной из проблем при работе из службами - это их отладка. Поскольку службы должны выполняться в контексте диспетчера управления службами, а не в контексте Visual Studio, отладка служб не является столь же простой задачей, как отладка других типов приложений Visual Studio. Для отладки службы необходимо запустить службу, а затем подключить отладчик к процессу, в котором она выполняется. После этого можно отлаживать приложение с помощью стандартных средств отладки Visual Studio. !!!Важно!!! Не следует подключаться к процессу, если неизвестна его природа и неясны последствия подключения и возможного его уничтожения. Например, при подключении к процессу WinLogon и последующей остановке отладки произойдет остановка системы, поскольку она не может работать без данного процесса.!!!
Подключение к процессу службы позволяет отлаживать большую часть ее кода (но не весь код); поскольку служба уже была запущена, невозможно, например, таким образом отладить код метода OnStart или метода Main, который используется для загрузки службы.
Короче, для дебага нужно сделать:
- Установите и запустите службу (многие забывают :-))
- В меню Отладка(Debug) Visual Studio выберите пункт Процессы (Attach to Process...).
- Поставьте галочки, что бы показывало все процессы
- В списке найдите свою службу и присоединитесь к ней (Attach)
- Поставьте BreakPoint в нужном методе и будет вам радость.
Одно из альтернатив служ есть scheduler, но как-то службы мне больше по душе.
|