Симон Робинсон - C# для профессионалов. Том II
- Название:C# для профессионалов. Том II
- Автор:
- Жанр:
- Издательство:Лори
- Год:2003
- Город:Москва
- ISBN:5-85582-187-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Симон Робинсон - C# для профессионалов. Том II краткое содержание
Платформа .NET предлагает новую среду, в которой можно разрабатывать практически любое приложение, действующее под управлением Windows, а язык C# — новый язык программирования, созданный специально для работы с .NET.
В этой книге представлены все основные концепции языка C# и платформы .NET. Полностью описывается синтаксис C#, приводятся примеры построения различных типов приложений с использованием C# — создание приложений и служб Windows, приложений и служб WWW при помощи ASP.NET, а также элементов управления Windows и WWW Рассматриваются общие библиотеки классов .NET, в частности, доступ к данным с помощью ADO.NET и доступ к службе Active Directory с применением классов DirectoryServices.
Для кого предназначена эта книгаЭта книга предназначена для опытных разработчиков, возможно, имеющих опыт программирования на VB, C++ или Java, но не использовавших ранее в своей работе язык C# и платформу .NET. Программистам, применяющим современные технологии, книга даст полное представление о том, как писать программы на C# для платформы .NET.
Основные темы книги• Все особенности языка C#
• C# и объектно-ориентированное программирование
• Приложения и службы Windows
• Создание web-страниц и web-служб с помощью ASP NET
• Сборки .NET
• Доступ к данным при помощи ADO NET
• Создание распределённых приложений с помощью NET Remoting
• Интеграция с COM, COM+ и службой Active Directory
C# для профессионалов. Том II - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
}
protected void RefreshServiceList() {
services = ServiceController.GetServices();
listBoxServices.DisplayMember = "DisplayName";
listBoxServices.DataSource = services;
}
Теперь все службы Windows выводятся в окне списка и можно получить данные о каждой службе. Класс ServiceController
имеет следующие свойства для данных о службе:
Свойства ServiceController |
|
---|---|
CanPauseAndContinue |
Если службе можно послать запрос pause и continue, то возвращается true . |
CanShutdown |
true , если служба имеет программу обработки для выключения системы. |
CanStop |
true , если службу можно остановить. |
DependentServices |
Возвращает совокупность подчиненных служб. Если служба остановлена, то все подчиненные службы заранее останавливаются. |
ServicesDependentOn |
Возвращаем совокупность служб, которые зависят от этой службы. |
DisplayName |
Имя, которое должно выводиться для этой службы. |
MachineName |
Имя машины, на которой выполняется эта служба. |
ServiceName |
Имя службы. |
ServiceType |
Служба может выполняться внутри общего процесса, где более одной службы используют один и тот же процесс ( Win32ShareProcess ), или выполняться так, что существует только одна служба внутри процесса ( Win32OwnProcess ). Если служба может взаимодействовать с рабочим столом компьютера, то тип будет InteractiveProcess . |
Status |
Статус службы. Статус может быть running, stopped paused или в некотором промежуточном режиме, таком как start pending, stop pending и т.д. |
В рассматриваемом приложении используются свойства DisplayName
, ServiceName
, ServiceType
и Status
для вывода данных о службе, а также CanPauseAndContinue
и CanStop
для включения и отключения кнопок Pause
, Continue
и Stop
.
Метод OnSelectedIndexChanged()
является методом обработки для окна списка. Он вызывается, когда пользователь выбирает
службу в окне списка. В методе OnSelectedIndexChanged()
внешнее имя и имя свойства задаются непосредственно с помощью свойств класса ServiceController. Статус и тип не могут просто задаваться, так как должна выводиться строка вместо числа, которое возвращает класс ServiceController
. Метод SetServiceStatus()
является вспомогательной функцией, просматривающей перечисление свойств Status
для выводa строки статуса, а также включает и отключает кнопки. GetServiceTypeName()
создает имя типа службы. ServiceType
мы получаем из ServiceController.ServiceType
представляет множество флажков, которые могут комбинироваться с помощью побитового оператора ИЛИ
. Бит InteractiveProcess
может задаваться вместе с Win32OwnProcess
и Win32ShareProcess
. Необходимо проверить, задан ли бит InteractiveProcess
прежде чем переходить к проверке других значений:
protected string GetServiceTypeName(ServiceType type) {
string serviceType = "";
if ((type & ServiceType.InteractiveProcess) != 0) {
serviceType = "Interactive ";
type -= ServiceType.InteractiveProcess;
}
switch (type) {
case ServiceType.Adapter:
serviceType -= "Adapter";
break;
case ServiceType.FileSystemDriver:
case ServiceType.KernelDriver:
case ServiceType.RecognizerDriver:
ServiceType += "Driver";
break;
case ServiceType.Win32OwnProcess:
ServiceType += "Win32 Service Process";
break;
case ServiceType.Win32ShareProcess;
ServiceType += "Win32 Shared Process";
break;
default:
ServiceType += "unknown type " + type.ToString();
break;
}
return ServiceType;
}
protected void SetServiceStatus(ServiceController controller) {
buttonStart.Enabled = true;
buttonStop.Enabled = true;
buttonPause.Enabled = true;
buttonContinue.Enabled = true;
if (!controller.CanPauseAndContinue) {
buttonPause.Enabled = false;
buttonContinue.Enabled = false;
}
if (!controller.CanStop) {
buttonStop.Enabled = false;
}
ServiceControllerStatus status = controller.Status;
switch (status) {
case ServiceControllerStatus.ContinuePending:
textBoxServiceStatus.Text = "Continue Pending";
buttonContinue.Enabled = false;
break;
case ServiceControllerStatus.Paused;
textBoxServiceStatus.Text = "Paused";
buttonPause.Enabled = false;
buttonStart.Enabled = false;
break;
case ServiceControllerStatus.PausePending:
textBoxServiceStatus.Text = "Pause Pending";
buttonPause.Enabled = false;
buttonStart.Enabled = false;
break;
case ServiceControllerStatus.StartPending:
textBoxServiceStatus.Text = "Start Pending";
buttonStart.Enabled = false;
break;
case ServiceControllerStatus.Running:
textBoxServiceStatus.Text = "Running";
buttonStart.Enabled = false;
buttonContinue.Enabled = false;
break;
case ServiceControllerStatus.Stopped:
textBoxServiceStatus.Text = "Stopped";
buttonStop.Enabled = false;
break;
case ServiceControllerStatus.StopPending:
textBoxServiceStatus.Text = "StopPending";
buttonStop.Enabled = false;
break;
default:
textBoxServiceStatus.Text = "Unknown status";
break;
}
}
protected void OnSelectedIndexChanged(object sender, System.EventArgs e) {
ServiceController controller =
(ServiceController)listBoxServices.SelectedItem;
textBoxDisplayName.Text = controllerDisplayName;
textBoxServiceType.Text =
GetServiceTypeName(controller.ServiceType);
textBoxServiceName.Text = controller.ServiceName;
SetServiceStatus(controller);
}
Управление службой
С помощью класса ServiceController
можно также посылать службе управляющие запросы.
Методы ServiceController |
|
---|---|
Start() |
Start() сообщает SCM, что служба должна быть запущена. В нашей служебной программе вызывается OnStart() . |
Stop() |
Stop() вызывает OnStop() в нашей служебной программе с помощью SCM, если свойство CanStop задано как true в классе службы |
Pause() |
Pause() вызывает OnPause() , если свойство CanPauseAndContinue задано как true. |
Continue() |
Continue() вызывает OnContinue() , если свойство CanPauseAndContinue задано как true. |
ExecuteCommand() |
С помощью ExecuteCommand можно послать службе специальную команду. |
Код для управления службой следует далее. Так как код для запуска, останова, приостановки и временной остановки аналогичен, то используется только одна программа обработки для четырех кнопок:
protected void buttonCommand_Click(object sender, System.EventArgs e) {
Cursor Current = Cursors.WaitCursor;
ServiceController controller =
(ServiceController)listBoxServices.SelectedItem;
if (sender == this.buttonStart) {
controller.Start();
controller.WaitForStatus(ServiceControllerStatus.Running);
} else if (sender == this.buttonStop) {
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped);
} else if (sender == this.buttonPause) {
controller.Pause();
controller.WaitForStatus(ServiceControllerStatus.Paused);
} else if (sender == this.buttonContinue) {
controller.Continue();
controller.WaitForStatus(ServiceControllerStatus.Running);
}
int index = listBoxService.SelectedIndex;
RefreshServiceList();
listBoxServices.SelectedIndex = index;
Cursor.Current = Cursors.Default;
Интервал:
Закладка: