VisualC#中调用Windows服务初探

VisualC#中调用Windows服务初探,第1张

VisualC#中调用Windows服务初探,第2张

Windows服务是一个独立于登录用户工作的Windows应用程序。它通常在计算机启动时就开始执行,并且经常持续运行直到计算机关机。Exchange Server、IIS、杀毒软件都使用这种方式,这样就可以独立于某个用户,在任何用户登录之前运行,也可以服务于所有进程,从而作为服务存在。

因为Windows服务有那么多功能,所以当你需要一些特殊功能的时候,可以考虑使用Windows服务来解决问题。比如下面我们要做的这个例子。对于我们程序员来说,计算机是一起工作时间最长的伙伴。我们每天都要在它的屏幕前度过八个多小时,还不包括下班后在家打游戏。因此,保护我们的眼睛是最重要的。问题的起因是周六去眼科做了激光手术复查。医生反复向我强调眼睛的自我调节能力,也就是说,只要你能保证每隔一个小时左右闭眼或者看远处,离开电脑屏幕,治愈的近视就不会反弹。虽然我是一个很自律的人,但是我已经不再在电脑屏幕前抬头了,经常几个小时就不抬头一次。为了眼睛的健康,我决定把这个艰巨的任务交给电脑,让它在一个小时左右自动提醒我休息五分钟。就这样,再也不用担心了。

虽然功能简单,但是写个程序放在启动组里每天自动运行也不是个好主意。正好我之前没做过Windows service,不如试试看,看看功能有多高级。网络为我们提供了。所以我决定用C#做一个提醒我保护眼睛的Windows服务,叫CareEye。

运行Visual Studio.NET 2003并在C#中设置一个Windows服务项目。CareEye.cs的设计视图提示您可以将所需的控件和组件拖动到其中。如果想做系统日志,当然可以拖动EventLog组件。不过这个程序好像不需要这些东西,还是算了吧。那么要不要用定时器控制计时呢?想了一下,这个控件虽然好用,但是用的太频繁了。基于学习新知识的原则,最合适的恐怕就是线头了。而且以后做其他Windows服务的时候,线程肯定是必须的,还是用线程比较好。这样,我只需要在线程中完成对时间的监控,把线程的启动和停止留给服务的启动和停止。哦,非常方便。

再来看看CareEye.cs的源程序,一大堆没见过的东西,仔细分析也没什么。CareEye类派生自ServiceBase类,因此它继承了基本服务类的特征。很明显,Main()方法会被SCM(服务控制管理器)调用。在这个方法中,运行一个新的CareEye实例,从而运行一个Windows服务。OnStart()和OnStop()显然是用来启动和停止服务的响应函数。

注意Main()方法中有一个ServiceBase[]数组,是为那些一个服务流程包含多个服务的准备的。对于这个程序来说,它只有一个CareEye服务,所以完全可以删除这个数组,只使用system . service process . service base . run(new care eye());一句话就够了。

接下来,为了使用线程,我们需要引入系统。线程命名室空,而为了使用对话框,我们还需要引入系统。Windows.Forms命名room 空,为以后提示用户时显示对话框做准备。

下面为类CareEye添加了一个成员字段private Thread MainThread同时,在构造函数中初始化它:

main Thread = new Thread(new ThreadStart(Thread func));
主线程。优先级=线程优先级。最低;

在这里,将线程的优先级设置为最低级别,以免消耗过多的系统性能。这个线程对象使用ThreadFunc作为线程函数,所以这个线程函数完成了:

public static void thread func()
{
int last hour = DateTime。现在。小时;
while(true)
{
System。线程. thread . sleep(60000);
if(datetime . now . hour-1 = = last hour)
{
messagebox . show("为了保护眼睛,请休息5分钟,看向远方!",“警告”,messageboxbuttons.ok,messageboxicon.warning,messagebox default button . button 1,
messagebox options . defaultdesktoponly);
last hour =日期时间。现在。小时;
}
}
}

剩下的代码很简单,只需在OnStart中启动线程,在OnStop中停止它。

上面的服务程序虽然很简单,但是线程处理不是很妥当,违背了很多服务程序原则,比如界面显示等。,但它足以满足我的需要,所以我做了它。如果需要,当然可以把对话框改成其他提醒,比如响铃等。线程也可以使用内核对象,使用更好的处理方法。

Windows服务完成了,剩下的就是测试了。但是如果你发现这个EXE无法运行,会提示你该EXE需要使用安装程序来安装服务。写程序好像是不可能的。即使是Windows服务,也要向Windows注册。

接下来,右键点击CareEye.cs的设计视图,添加安装程序(VS.net认为这是非常周到的)。现在,又一批代码出来了,好在不用改代码了。只需将Account的帐户类型设置为LocalSystem,将StartType设置为manual startup即可。这里用手动,方便调试,以后可以改成自动类型。

编译后还是不能运行。这里,还有一个步骤是运行installutil来安装这个服务。它的安装和卸载用法是:

CareEye.exe安装程序
CareEye.exe安装程序/u

安装系统的服务管理器后,就可以看到你的服务了。只要点击开始启动它,它就会通过把时间往前调一个小时来提醒你需要休息一下。呵呵,再简单不过了。

如果想做一个安装包分发给好友,只需要再添加一个部署项目。但是,为了完成自注册,您需要在自定义操作编辑器的安装阶段添加一个自定义安装操作,并将InstallerClass属性设置为TRUE。

剩下的事情就是自己去尝试了。这次不用担心用眼加班了!

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VisualC#中调用Windows服务初探

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情