C#制作Windows service服务系列三制作可控制界面的windows服务(windows service) (转载)

摘要:
在前面两篇文章中,我们可以做到自启动windows和定时自动执行windowsservice系列一:制作一个可安装、可启动、可停止、可卸载的Windowsservice系列二:演示一个定期执行的windows服务及调试系列三:windowsservice系列三--制作可控制界面的windowsservice本文将重点介绍下如何通过界面控制肉眼看不到的windowsservice。

在前面两篇文章中,我们可以做到自启动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 btnStart;
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

第三步:添加用到的方法,代码如下:   

#regionMethodsprivatevoidrunService(stringservername)
{
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系列学习心得。呵呵

邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。助人等于自助!3w@live.cn

免责声明:文章转载自《C#制作Windows service服务系列三制作可控制界面的windows服务(windows service) (转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zookeeper安装配置Laya鼠标事件阅读下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

三款优秀的替代Xshell的SSH软件

在前一篇文章中,由于公司禁止使用xshell,我有一段时间非常不舒服,因为我找不到一个好的工具来替代xshell。上一篇文章中提到的功能对我来说太简单了,界面不够友好。但经过我的不懈努力和您的评论,我终于找到了这三个同样优秀的终端工具来取代xshell。这三个软件是:终端、Electerm和windterm。他们有自己的优点,同样优秀。让我们简单介绍一下我的...

MySQL学习笔记:字符串前后补全0

遇到一个要求:如果位数小于6,则需要使用函数LPAD()和RPAD()自动完成6位。LPAD使用字符串padstr填充并完成左侧的str,直到其长度达到len个字符,并返回str。...

页面加载时自动执行(加载)js的几种方法

Js调用onload方法window.onload=function(){func1();func2();func3();}二、JQ方法1.整个页面的document全部加载完成以后执行。不幸的这种方式不仅要求页面的DOMtree全部加载完成,而且要求所有的外部图片和资源全部加载完成。更不幸的是,如果外部资源,例如图片需要很长时间来加载,那么这个js方法执行...

Oracle的分条件计数COUNT(我的条件),由浅入深

@目录本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle COUNT内置函数。复杂计数。常规操作。中间操作。对中间操作的反思。高级操作。高级操作的修订版本。(你需要根据你的业务知识灵活轮换。)总结。本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle计数。所有操作都基于下表作为操作对象。创建一个名为sqlcreateta...

Linux中使用gdb dump内存

在应急响应中,我们经常需要转储某个内存块以进行分析。今天我们将讨论使用gdb命令转储sshd进程的内存。根据Linux系统的设计理念,内核只提供转储内存的机制。用户要转储什么样的内存以及要转储多少内存是策略问题,由用户决定。之后,转到/tmp目录,可以从dump中看到sshd.dmp内存字符串-10sshd.dump#,以查看sshd.ddump内存中至少超...

Elasticsearch之插件介绍及安装

3.KopfPlugin(主要)Kopf是ElasticSearch的管理工具。它还为ES集群操作提供了API。4.级别插件级别工具可以帮助用户监控ElasticSearch的运行状态。但是,此插件需要许可证。安装许可证后,您可以安装marvel的代理。代理将收集弹性搜索的运行状态。ES插件HeadPlugin的在线安装需要转到https://github....