在前面两篇文章中,我们可以做到自启动windows和定时自动执行windows service
系列一: 制作一个可安装、可启动、可停止、可卸载的Windows service(downmoon原创)
系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon)
系列三: windows service系列三--制作可控制界面的windows service
本文将重点介绍下如何通过界面控制肉眼看不到的windows service。其实主要用到的类是:
ServiceController ,可以看官方 的说明,如果急于看到结果,请直接往下看。
准备工作:假定我们已经做好一个wondows service,并且已经部署,服务名为pingServiceDemo,
下面我们制作一个可控制的界面来操作这个windows service
开始:
第一步:新建一个winform项目,名为 CtrlPingService,添加System.ServiceProcess.dll的引用。
第二步:定义变量,添加按钮事件,主要代码如下:
privateSystem.Windows.Forms.Button btnStop;
privateSystem.Windows.Forms.Button btnExit;
privateSystem.ServiceProcess.ServiceController sController;
privateLabel lbInfo;
privateButton ftnPause;
privateButton btnResume;
privateLabel lbServiceName;
privateTextBox txtServerName;
privateButton btnServiceState;
privatestringserverName;
#regionEcentsprivatevoidfrmMain_Load(objectsender, EventArgs e)
{
if(serverName ==null) { serverName =txtServerName.Text.Trim(); }
lbInfo.Text ="当前服务状态是:"+getStateForService(serverName);
}
privatevoidbtnServiceState_Click(objectsender, EventArgs e)
{
lbInfo.Text ="当前服务状态是:"+getStateForService(serverName);
}
privatevoidbtnStart_Click(objectsender, System.EventArgs e)
{
runService(serverName);
}
privatevoidbtnStop_Click(objectsender, System.EventArgs e)
{
killService(serverName);
}
privatevoidftnPause_Click(objectsender, EventArgs e)
{
pauseService(serverName);
}
privatevoidbtnResume_Click(objectsender, EventArgs e)
{
resumeService(serverName);
}
privatevoidbtnExit_Click(objectsender, System.EventArgs e)
{
this.Close();
Application.Exit();
}
#endregion
第三步:添加用到的方法,代码如下:
{
ServiceController sc =newServiceController(servername);
ServiceControllerStatus st =sc.Status;
switch(st)
{
caseServiceControllerStatus.StopPending:
caseServiceControllerStatus.Stopped:
sc.Start();
break;
default: break;
}
sc.WaitForStatus(ServiceControllerStatus.Running);
st =sc.Status;//再次获取服务状态if(st ==ServiceControllerStatus.Running)
{
lbInfo.Text ="服务 "+sc.ServiceName +"已经启动!";
}
}
privatevoidkillService(stringservername)
{
ServiceController sc =newServiceController(servername);
ServiceControllerStatus st =sc.Status;
switch(st)
{
caseServiceControllerStatus.Running:
caseServiceControllerStatus.StartPending:
caseServiceControllerStatus.Paused:
caseServiceControllerStatus.PausePending:
caseServiceControllerStatus.ContinuePending:
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
break;
}
st =sc.Status;//再次获取服务状态if(st ==ServiceControllerStatus.Stopped)
{
lbInfo.Text ="服务 "+sc.ServiceName +"已经停止!";
}
}
privatevoidpauseService(stringservername)
{
ServiceController sc =newServiceController(servername);
ServiceControllerStatus st =sc.Status;
switch(st)
{
caseServiceControllerStatus.Running:
caseServiceControllerStatus.StartPending:
sc.Pause();
sc.WaitForStatus(ServiceControllerStatus.Paused);
break;
}
st =sc.Status;//再次获取服务状态if(st ==ServiceControllerStatus.Paused)
{
lbInfo.Text ="服务 "+sc.ServiceName +"已经暂停!";
}
}
privatevoidresumeService(stringservername)
{
ServiceController sc =newServiceController(servername);
ServiceControllerStatus st =sc.Status;
switch(st)
{
caseServiceControllerStatus.Paused:
caseServiceControllerStatus.PausePending:
sc.Continue();
sc.WaitForStatus(ServiceControllerStatus.Running);
break;
}
st =sc.Status;//再次获取服务状态if(st ==ServiceControllerStatus.Running)
{
lbInfo.Text ="服务 "+sc.ServiceName +"已经继续!";
}
}
privatestringgetStateForService(stringservername)
{
ServiceController sc =newServiceController(servername);
ServiceControllerStatus st =sc.Status;
returnsc.Status.ToString();
}
#endregion
OK! 最后欣赏下我们的成果:
邀月总结:其实WCF完全可以做到这些。这里只是作了一个简单演示。稍后可能会写WCF系列学习心得。呵呵