| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: C# C Sharp) :: Создание C# сервисов Шаг-За-Шагом. Часть 1
Создание C# сервисов Шаг-За-Шагом. Часть 1Автор: Terry Denham 10 Apr 2003. Перевод: MC707 29 Jan 2005 для Realcoding.NET
Эта мульти-статья была поделена мной на следующие части:
Использование кода Начнем с создания нового C# проекта, выбрав console application. Visual Studio .NET предлагает мастер создания Windows Service используя C#, но я его не использовал, т.к. не все имеют VS.NET. Рисунок 1 показывает экран создания проекта.
Рисунок 1 Теперь, когда мы создали пустое приложение console application, нам нужно изменить некоторые его свойства, по умолчанию оставленные мастером. Откроем файл Class1.cs. Он содержит точку входа приложения. Переименум класс Class, чтобы лучше отразить его роль в приложении. Щелкнем правой клавишей мыши по узлу Class1.cs в Solution Explorer и выберем Rename. Переименуем файл Application.cs. Затем щелкнем правой клавишей мыши и выберем View Code. Изменим в коде класс Class на Application. Также нам надо изменить пространство имен, чтобы показать, где существует наш класс. Я имею домен, где я использую мой пример, названный CodeBlooded и я собираюсь использовать его в качестве имени. Вы можете использовать любое имя какое пожелаете. Т.к. этот сервис – часть вымышленной игры Spades (которую я скоро закончу писать), мы будем использовать пространство имен CodeBlooded.Spades.Services. Отредактируем файл Application.cs и изменим пространство имен SpadesServer на CodeBlooded.Spades.Services.
Рисунок 2 Пока мы еще находимся в диалоге свойств проекта, перейдем на закладку Configuration Properties | Build и изменим Outputs | XML Documentation File на SpadesServer.xml. Это XML файл, который создаст компилятор для помощи в документировании проекта. Посмотрите в .NET framework SDK и посмотрите, какие тэги он поддерживает. Рисунок 3 показывает этот диалог.
Проблема в том, что методы OnStart и OnStop должны возвратить управление обратно в Service Control Manager в течение 1 минуты, чтобы Service Control Manager знал, запущен или остановлен сервис. Как же мы добьемся того, чтобы возвратить в течение 1 минуты главному управлению? Мы должны создать фоновый поток, берущий всю работу на себя. Чтобы не переписывать заново код каждый раз при добавлении класса, я написал базовый класс, ответственный за создание потока и коммуникации с SCM. Создадим новый класс и назовем его SpadesServiceBase. Он выглядит примерно так. using System; В конечном итоге получим 3 сервиса, управляющие состоянием игры со службой администрирования, которая будет управлять и/или обслуживать другие 3 сервиса. Чтобы это реализовать, служба администрирования должна происходить от класса SpadesServiceBase, но мы создадим другой класс, который происходит от класса SpadesServiceBase, от которого будут происходить 3 класса-потомка. Это поможет нам лучше изолировать общедоступный код, при наличии базового класса низшего уровня, содержащего код, применяемого ко всем службам, и классы-потомки базового класса будут иметь общий код, доступный всем порожденным службам. Итак, создадим другой класс и назовем его SpadesChildServiceBase. Пусть он наследуется от SpadesServiceBase. Создавайте файл любым способом, но код должен выглядеть примрерно так: using System; Теперь мы собираемся написать код фонового потока и синхронизации объектов, используемых SCM, чтобы стартовать и останавливать фоновый поток. Фоновый поток будет периодически возобновляться и проделывать некоторые действия. Если мы хотим написать службу, которая зависит от сообщений, исходящих от клиента, то можно использовать любой механизм IPC для управления синхронизации. В следующих статьях я опишу другой способ, используя асинхронный вызов сокетов, но сейчас я просто создам опорный механизм, управляющий работой сервисов. Чтобы облегчить основные классы, связанные с другими производными классами, базовый класс предоставляет виртуальный метод, называемый Execute, который должен быть реализован сервисом. Метод Execute вызывается периодически базовыми классами, поскольку это запрограммировано нашим таймером. Также, метод Execute должен содержать некоторую логику, отвечающую за периодическое действие каждого сервиса. Мы должны добавить ссылку на System.Threading к нашему классу SpadesServiceBase и добавить переменную m_thread типа Thread. Также, мы должны использовать ManualResetEvent из пространства имен Threading, чтобы соединиться или остановить запрос от SCM. В методе OnStart класса SpadesServiceBase, мы создадим объект Thread, так же, как и ManualResetEvent. Чтобы запустить поток, нам нужно определить метод старта потока, который будет являться точкой входа потока. В нашем случае мы назовем метод ServiceMain и используем класс ThreadStart для определения нашего метода ServiceMain. Изменим код класса SpadesServiceBase на такой: using System; Теперь, когда мы позаботились о деталях, приступим к созданию административного сервиса. Хоть и сервис не будет ответственен за многое, в следующих нескольких уроках мы добавим в него функциональности. Сейчас создадим новый класс SpadesAdminService, производный от SpadesServiceBase. Следующий код – шаблонный для административного сервиса. using System; Теперь, когда сервис написан, нужно сделать некоторую рутинную работу, чтобы иметь именно сервис. Все что нам нужно сделать для этого – это создать совокупность объектов ServiceBase и просто вызвать метод Run базового класса ServiceBase. Добавьте следующий код к методу Main объекта Application. Следующий фрагмент кода показывает все необходимое для запуска сервиса. static void Main(string[] args) Теперь мы близко подобрались к раскрытию темы статьи. Все что нам осталось – добавить наши Installers. Они могут быть вызваны программой установщиком, который я опишу в следующей статье, либо вызовом программы InstallUtil из framework SDK. Добавим новый инсталлер к нашему проекту и назовем его SpadesInstaller. После запуска мастера Add Class, добавим код к конструктору класса. Инсталлер использует атрибуты, принадлежащие классу, в котором инсталлер создает экземпляр каждого класса, которые имеют атрибут RunInstaller. Все, что нам нужно – экземпляр ServiceProcessInstaller, чтобы управлять запуском сервиса, и создать объект ServiceInstaller для каждого устанавливаемого сервиса. После установки нескольких свойств этих объектов, добавим их к коллекции Installers. Следующий фрагмент кода показывает все необходимое для установки сервиса. using System; installutil SpadesServer.exe Если вы хотите удалить сервисы, выполните следующую команду: installutil SpadesServer.exe -U После этого мы можем запускать и останавливать сервисы из Service Control Manager. В следующих статьях мы добавим большую функциональность framework, которую создали здесь. Добавим несколько дочерних сервисов, которые будут запускать незапущенный главный сервис. Главный сервис будет останавливать дочерние, если будет остановлен. Рубрика: C# C Sharp)
ASP.NET и немного поисковой оптимизации.
С тех пор, как появилась Альтависта, большинство посетителей стали приходить на сайты из поисковых машин. И головной боли стало больше. Теперь мало написать сайт, нужно сделать его совместимым с поисковыми ботами. Одна из тех задач, которую приходится решать — быстрая переиндексация обновлений на сайте. Поисковые роботы чаще посещают те сайты, которые чаще меняются.
Подробнее... |
Рубрика: Советы
| Добавлено: 30.07.2008
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google.
Наконец-то я могу поделиться тем, чему уже давно радуюсь сам: Google открывает исходники Protocol Buffers! Что это и почему надо радоваться? Это простой и удобный способ обмена данными. Можно сказать, альтернатива XML, но гораздо менее амбициозная и (поэтому) более быстрая и компактная. Далее - перевод отрывка анонса в блоге Open Source at Google и пример использования.
Подробнее... |
Рубрика: Программирование для Web на C
| Добавлено: 30.07.2008
Описание VivaVisualCode.
В данной статье рассмотрена программа VivaVisualCode, демонстрирующая использование библиотеки VivaCore. Программа VivaVisualCode графически отображает дерево разбора для вводимого исходного кода на языке Си++.
Подробнее... |
Рубрика: VivaCore
| Добавлено: 29.07.2008
Остальные статьи:
JQuery: Пара сотен плагинов в одной заметке
Касание сетки
Разработка элементов управления ASP.NET на примере навигационной панели
Сохранения параметров приложения в .Net
Custom cursors в .Net
Бегун убегает от хозяина
"Битрикс" выпустил седьмую версию CMS
Выбираем систему управления сайтом
Рынок CMS в Европе или впечатления с CeBIT 2008
32 подводных камня OpenMP при программировании на Си++
Проeкт - шифровка
А что если..? (операторы if...else в C#)
Измерение скорости работы скрипта
О том как разработчики пьют кофе
Работаем с LINQ to XML
XmlSerializer - Assembly Leak без спроса |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|