视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
用C#开发Windows服务监控系统使用
2025-09-30 08:50:02 责编:小OO
文档

用C#开发Windows服务监控系统使用

  摘要 本文将向你展示如何用C#开发一个Windows服务来记录系统使用情况。

  每一个人都想知道他们每天在什么时间启动和关闭自己的系统,以及系统每天运行了多少时间。如果用一个DataGrid控件来显示系统启动、关闭及所消耗的时间将是一个不错的主意。

  在本文中,我提供了一种方法来实现这一目标-使用C#开发一个Windows服务。其实,每个人都了解一点Windows服务。但是,为了介绍之目的,我仅尽可能少得解释一下Windows服务。然后,我们来讨论如何设计一个这样的应用程序。

  一、 什么是Windows服务?

  其实,Windows服务只是运行于后台的并不要求我们了解的一种进程而已。而且,它们的绝大部分并不要求用户交互。如果我们在"开始"菜单的"运行"命令行下输入"services.msc"并回车,那么我们就可以看到在我们当前的系统中运行的服务情况。其中,有一些服务是当系统启动时自动启动的。但是,也有一些服务必须在我们的手工启动下才能运行。

  二、 Windows服务的优点

  1. 能够自动运行。

  2. 不要求用户交互。

  3. 在后台运行。

  一般情况下,Windows服务被用于耗费时间很多的进程中,例如备份数据库,等等。

  现在,我们要设计一个Windows服务来实现记录你的系统启动和关闭需要的时间。我使用Visual Studio 2003设计了这个应用程序。

  三、 设计Windows服务

  第一步:

  首先打开Visual Studio并且选择Visual C#工程。选择模板类型为Windows服务,并命名为Monitoring,如下图所示:

选择模板类型为Windows服务

  第二步:

  按F7键打开代码窗口。然后,加入对System.IO命名空间的引用,以便把系统定时功能编写到一个文件中。下一步,用Monitoring一词替换所有出现的Service1一词。之后,转入设计模式(按键shift+F7)。选择Solution Explorer(按键Ctrl+Alt+L)。点击Service1.cs并且命名它为Monitoring.cs。

  之后,转入代码窗口。在OnStart事件中加入下列代码,如下图所示:

在OnStart事件中加入代码

  在OnStart事件中实现的功能

  首先,在c盘上创建一个xml文件,并命名为file1。然后,在这个文件中建立如下代码:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<times>

  然后,关闭它。

  我创建了一个服务,它能够在系统启动时自动启动并且记录下启动时间。当系统关闭时,它也关闭。而且,它会记录下关闭时间和系统中所花费的时间。

  首先,我要创建一个StreamWriter来把系统启动时间写入file1.xml文件中。

  在把代码复制到你的OnStart事件后,正好在Monitoring构造器的上面创建一个公共变量temp,如下图所示:

创建一个公共变量temp

  此后,把这部分代码复制到你的代码窗口: 

  再把下面代码复制到OnStart事件中,如下图所示:

StreamWriter writer=File.AppendText("d:\\file1.xml");

writer.Write("<time>");

writer.WriteLine("<Date> "+ (DateTime.Now.ToString("dd-MM-yy"))+"</Date>");

writer.WriteLine("<started> "+ (DateTime.Now.ToString("t"))+"</started>");

temp=DateTime.Now; 

writer.Close();

复制到OnStart事件

在OnShutdown事件中实现的功能

  当系统要关闭时,我使用一个StreamWriter再次打开file1.xml-它将记下系统关闭时间,还将记下在系统启动和关闭之间所花费的时间跨度。我在OnStart和OnShutdown事件中使用了一个temp变量。在OnStart中,它用于存储启动时间。然后,它被再次用于OnShutdown事件中来记下系统启动和关闭之间所花费的时间间隔。

  然后,我们必须配置我们的Windows服务以便安装和运行。

  因此,首先转到设计视图中,并选择属性窗口(可以按下F4)。

  把CanStop和CanShutdown设置为true。在安装之前,我们必须要安装一个安装程序。

  右击设计视图窗口,然后选择"Add Installer"。然后,它将显示ProjectInstaller.cs。在这个文件中,serviceInstaller1和serviceProcessInstaller1都存在。转到serviceProcessInstaller1属性处:

  · 把Account设置为LocalSystem。

  · 然后,转到serviceInstaller1属性处。

  · 把DisplayName和ServiceName设置为Monitoring。

  · 设置启动类型(StartType)为automatic。

  请参考下图:

参考设置

参考设置

  然后,转到VS.NET的命令提示符下。

  在控制台下,转到服务的Debug文件夹下:

  输入"InstallUtil Monitoring.exe"

  如果它显示"Commit Phase Completed Successfully",则说明服务被成功安装。

  然后,重启系统以启动服务。在重启之后,打开file1.xml文件,它记录了系统的开始时间。如果关闭系统,它将记录下系统的关闭时间和使用系统的时间长度。通过这一部分,我们已经完成了记录下系统所消耗的时间。接下来,我们将创建一个web应用程序以便在一个Grid控件中显示xml数据。

  在下一部分中,我将解释如何抽取这个xml文件数据并且在一个DataGrid控件中显示它。

  四、 用C#创建一个Web应用程序

  在这一部分中,我们用C#创建一个web应用程序,并命名为SystemMonitor。

  加入下面命名空间:

using System.IO;

using System.Xml;

using System.Text;

  之后,把DataGrid和Label控件拖动到页面上,如下图所示:

把DataGrid和Label控件拖动到页面上

  把下列代码复制到Page_Load事件中:

File.Copy("c:\\file1.xml","c:\emp1.xml",true);

StreamWriter writer1=File.AppendText("c:\emp1.xml");

writer1.Write("<shutdown>undefined</shutdown>");

writer1.Write("<timespent>undefined</timespent>");

writer1.Write("</time>");

writer1.WriteLine("</times>");

writer1.Close();

DataSet ds=new DataSet();

ds.ReadXml("c:\emp1.xml");

TimeSpan t=new TimeSpan();

DataGrid1.DataSource=ds;

DataGrid1.DataBind();

XmlTextReader reader=new XmlTextReader("c:\emp1.xml");

while(reader.Read())

{

 if(reader.NodeType==XmlNodeType.Element)

 {

  if(reader.Name=="timespent")

  {

   string temp11=reader.ReadInnerXml().ToString();

   if(temp11!="undefined")

   {

    temp11=temp11.Replace(":",".");

    temp11=temp11.Replace(" ","");

    duration +=Convert.ToDouble(temp11);

   }

  }

 }

}

Response.Write("Total Duration is : ");

double temp122=Convert.ToDouble(duration);

string hr=temp122.ToString();

string hrstr=hr.Substring(0,hr.IndexOf("."));

Response.Write(hrstr.ToString()+" Hours");

string mins=hr.Substring(hr.IndexOf(".")+1,(hr.Length -hr.IndexOf(".")-1));

Response.Write(" "+mins.ToString()+" Minutes");

reader.Close();

File.Delete("c:\emp1.xml");

  最后把下面的声明粘贴到Page_Load事件上部:

private double duration;

  我解释一下程序在Page_Load事件中做了什么。

  首先,我把文件file1.xml(它包含系统定时信息)的内容复制到临时文件中。然后,我把一些标记添加到该临时文件中。之后,我把temp的内容读取到一个dataset中,最后把它绑定到一个DataGrid中。以后,我创建逻辑来查找所有花费的时间。

  我非常希望每个人都能理解上面的代码。

  上面页面的输出结果大致如下图所示:

输出结果

下载本文
显示全文
专题