C# для профессионалов. Том II
Шрифт:
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) {
Поделиться с друзьями: