首页 > 开发 > 综合 > 正文

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

2024-07-21 02:28:56
字体:
来源:转载
供稿:网友

  摘要 本文将向你展示如何用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,如下图所示:

  第二步:

  按f7键打开代码窗口。然后,加入对system.io命名空间的引用,以便把系统定时功能编写到一个文件中。下一步,用monitoring一词替换所有出现的service1一词。之后,转入设计模式(按键shift+f7)。选择solution explorer(按键ctrl+alt+l)。点击service1.cs并且命名它为monitoring.cs。

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


  在onstart事件中实现的功能

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

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

  然后,关闭它。

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

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

  在把代码复制到你的onstart事件后,正好在monitoring构造器的上面创建一个公共变量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();


  在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控件拖动到页面上,如下图所示:


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

file.copy("c://file1.xml","c://temp1.xml",true);
streamwriter writer1=file.appendtext("c://temp1.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://temp1.xml");
timespan t=new timespan();
datagrid1.datasource=ds;
datagrid1.databind();
xmltextreader reader=new xmltextreader("c://temp1.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://temp1.xml");

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

private double duration;

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

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表