Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

client.Connect(

textBoxHostname.Text, Convert.ToInt32(textBoxPortNumber.Text));

NetworkStream stream = client.GetStream;

byte[] buffer = new Byte[1024];

int received = stream.Read(buffer, 0, 1024);

if {received <= 0) {

statusBar.Text = "Read failed"; return;

}

texBoxQuote.Text = Encoding.Unicode.GetString(buffer);

 } catch (SocketException ex) {

statusBar.Text = ex.Message;

 } finally {

client.close;

 }

}

Запустив

тестовый сервер и клиент этого оконного приложения, можно протестировать функциональность. Успешное выполнение может дать следующий результат при использовании указанных на экране настроек:

Добавим серверу функциональность службы. Программа уже выполняется, что же нужно еще сделать? Необходимо, чтобы серверная программа автоматически запускалась во время начальной загрузки системы без какого-либо пользователя, зарегистрировавшегося в системе, и мы хотим управлять ею с помощью служебных управляющих программ.

Проект Windows Service

Используя новый мастер проектов для C# Windows Services, можно теперь начать создавать службу Windows. Будьте внимательны, чтобы не выбрать проект Web Service.

Службы Web рассматриваются в главе 17.

После нажатия OK для создания приложения Windows Service появится окно проектировщика, как в приложениях Windows Forms, но здесь нельзя вставлять компоненты Windows Forms. Окно проектировщика будет использоваться для добавления других компонентов, таких как счетчики производительности и регистрации событий: Выбор свойств этой службы открывает окно редактора свойств:

Сконфигурируем свойства службы:

□ AutoLog означает, что события автоматически регистрируются для запуска и остановки службы.

□ CanPauseAndContinue, CanShutdown и CanStop означают, что служба может обрабатывать специальные запросы pause, continue, shutdown и stop.

□ ServiceName является именем службы, которое записывается в реестр и используется для управления службой.

□ CanHandlePowerEvent является допустимым параметром для служб, работающих на системе Windows 2000. Мы поговорим о параметрах power позже.

По умолчанию используется имя службы WinService1 независимо от названия проекта. Можно установить только одну службу WinService1. Если возникает ошибка установки во время процесса тестирования, то причина может быть в этом. Проверьте, что имя службы изменено на более подходящее в начале разработки службы.

Изменение этих свойств с помощью редактора свойств задает значения нашего класса, производного из

ServiceBase
, в методе
InitializeComponent
. Мы уже знаем этот метод из приложений Windows Forms. Со службами он используется аналогичным образом.

Мастер создаст код, но мы изменим имя файла на

QuoteService.cs
, имя пространства имен на
Wrox.ProfessionalCSharp
, а имя класса на
QuoteService
. Мы подробно рассмотрим этот код позже, а пока остановимся на классе
ServiceBase
.

Класс ServiceBase

Класс

ServiceBase
является базовым для всех служб .NET. Наш класс
QuoteService
выводится из
ServiceBase
. Этот класс общается со служебным управляющим менеджером при помощи недокументированного вспомогательного класса
System.ServiceProcess.NativeMethods
, который служит просто классом-оболочкой для вызовов API Win32. Этот класс закрытый, поэтому мы не можем его использовать.

Следующая диаграмма последовательностей показывает взаимодействие SCM — класса

QuoteService
и классов из пространства имен
System.ServiceProcess
. На диаграмме последовательностей просматриваются вертикальные линии жизни объектов и коммуникация, проходящая в горизонтальном направлении. Коммуникация упорядочена по времени сверху вниз:

SCM запускает процесс службы. Вначале вызывается метод

Main
. В методе
Main
нашей службы вызывается метод
Run
базового класса
ServiceBase
.
Run
регистрирует метод
ServiceMainCallback
с помощью
NativeMethods.StartServiceCtrlDispatcher
в SCM и записывает вход в журнал событий.

Следующий шаг — SCM вызывает зарегистрированный метод

ServiceMainCallback
в нашей программе службы.
ServiceMainCallback
сам регистрирует обработчик с помощью
NativeMethods.RegisterServiceCtrlHandler[Ex]
и задает статус службы в SCM. Затем вызывается метод
OnStart
, в котором мы должны реализовать код запуска. Если
OnStart
выполнился успешно, то значение ресурса для
StartSuccessful
записывается в журнал событий.

Обработчик реализуется в методе

ServiceCommandCallback
. SCM вызывает этот метод, когда служба запрашивает изменения. Метод
ServiceCommandCallback
направляет запросы далее в
OnPause
,
OnContinue
,
OnStop
,
OnCustomCommand
и
OnPowerEvent
.

Основная функция

Рассмотрим сгенерированную основную функцию служебного процесса. В ней объявляются массив

ServiceToRun
классов
ServiceBase
. Один экземпляр класса
QuoteService
создается и передается как первый элемент массива
ServiceToRun
. Если должно выполняться более одной службы внутри этого служебного процесса, то необходимо добавить в массив больше экземпляров специальных служебных классов. Этот массив передается затем в статический метод
Run
класса
ServiceBase
. С помощью метода
Run
из
ServiceBase
мы задаем ссылки SCM для точек входа служб. Основной поток выполнения служебного процесса теперь заблокирован и ожидает завершения службы.

Вот автоматически сгенерированный код:

// Основная точка входа для процесса

static void Main {

 System.ServiceProcess.ServiceBase[] ServicesToRun;

 // Более одной службы пользователя может выполняться в одном процессе.

 // Чтобы добавить другую службу в этот процесс, измените следующую

 // строку для создания второго служебного объекта. Например:

 // ServiceToRun = New System.ServiceProcess.ServiceBase[]

Поделиться:
Популярные книги

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Инвестиго, из медика в маги. Том 6. Финал

Рэд Илья
6. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги. Том 6. Финал

Законы Рода. Том 11

Flow Ascold
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Страж Кодекса. Книга IX

Романов Илья Николаевич
9. КО: Страж Кодекса
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Страж Кодекса. Книга IX

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Охота на царя

Свечин Николай
2. Сыщик Его Величества
Детективы:
исторические детективы
8.68
рейтинг книги
Охота на царя

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Неудержимый. Книга V

Боярский Андрей
5. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга V

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6