Windows服务还是比较强大的,这种应用程序没有用户界面,可以随系统的启动而运行起来,任何用户消息可以被写进Windows事件日志里,也可以将服务设置为本地服务,不受用户限制,可以对服务进行暂停继续等,但是如果服务是做实时监控的话,还是建议将服务的暂停功能禁掉。
优点说了一堆了,看看实战吧,所谓的实战也是从别人的博客中学习过来的,我这里就借用一下梦幻Dot Net的一篇博客——用.Net开发Windows服务初探。讲的比较详细了,我在这里是要说一下我在创建Windows服务时遇到的一些问题,分享给大家。
————————————————————————————————————————————————————————————————————
首先要说的是安装Windows服务:
安装服务需要用到InstallUtil.exe程序,将编译好的服务应用程序的路径拷贝下来,进入CMD,找到服务应用程序所在目录,运行"InstallUtil YourServiceName.exe"。
问题就来了,如果是在系统环境变量中未做设置,这里就会报错了,提示InstallUtil命令不可用,那就配置一下环境变量吧,一般目录都在“C:\Windows\Microsoft.NET\Framework\v4.0.30319”,如果项目版本是4.0的话就设置这个路径吧,如果这个设置的版本低,还会报出版本比应用程序版本低的错误。
上面的问题如果不想麻烦也可以,单击“开始-->所有程序-->Microsoft Visual Studio 2010-->Visual Studio Tools-->Visual Studio 命令提示(2010)”,后续一样。
还有一点要注意的是重新编译的服务都要先卸载掉原来的Windows服务,然后再安装重新编译好的Windows服务。
其次要说的是EventLog的属性设置:
在我的项目中添加了EventLog控件,他有一个属性EnableRaisingEvents,Microsoft给出的解释是“指示该组建是否监视事件日志的更改情况”,默认为False,如果改为True则安装好Windows服务之后无法启动该服务。具体原因暂时不清楚,也许和其他设置有关系吧,如果有明白的童鞋还请指教。
最后贴上我的源码供大家分享:(不显示行号了,为了大家拷贝方便)
private bool servicePaused = false;
/// <summary>
/// 启动服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
eventLog.WriteEntry(" 这个服务在:" + DateTime.Now.ToString() + "被启动了!");
fileSystemWatcher.EnableRaisingEvents = true;//开始监听
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
fileSystemWatcher.Created += new FileSystemEventHandler(OnFileCreated);
fileSystemWatcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
fileSystemWatcher.Renamed += new RenamedEventHandler(OnFileRenamed);
}
/// <summary>
/// 停止服务
/// </summary>
protected override void OnStop()
{
}
private void OnFileChanged(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被改动了!");
}
}
private void OnFileRenamed(Object source, RenamedEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被重命名了!");
}
}
private void OnFileCreated(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被创建了!");
}
}
private void OnFileDeleted(Object source, FileSystemEventArgs e)
{
if (servicePaused == false)
{
eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被删除了!");
}
}