当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

摘要 本文将向你展示如何用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中。以后,我创建逻辑来查找所有花费的时间。

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

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

点击放大此图片

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

本文出自 “青峰” 博客,转载请与作者联系!

转载于:https://my.oschina.net/learnbo/blog/829206

相关文章:

  • 8VC Venture Cup 2017 - Elimination Round - A
  • PostgreSQL SystemTap on Linux
  • Java 操作XML,JDOMDOM4J
  • React怎么创建.babelrc文件
  • JavaSE 学习参考:switch语句
  • Git使用技巧(1)-- 配置【持续更新】
  • Maven 上传 jar 到 私服命令
  • 我们发的不是红包,而关系证明
  • grep和sed匹配多个字符关键字的用法
  • mybatis的延迟加载
  • OVS VxLAN Flow 分析 - 每天5分钟玩转 OpenStack(149)
  • [Manacher]【学习笔记】
  • python 常见问题总结
  • http通信json解析过滤无关字符
  • kalilinux、parrotsecos没有声音
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Java 内存分配及垃圾回收机制初探
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript 哈希表
  • java第三方包学习之lombok
  • js学习笔记
  • LeetCode29.两数相除 JavaScript
  • mac修复ab及siege安装
  • Python 基础起步 (十) 什么叫函数?
  • Ruby 2.x 源代码分析:扩展 概述
  • vue--为什么data属性必须是一个函数
  • windows下使用nginx调试简介
  • Zepto.js源码学习之二
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 记录一下第一次使用npm
  • 如何合理的规划jvm性能调优
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 实现菜单下拉伸展折叠效果demo
  • 我与Jetbrains的这些年
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 硬币翻转问题,区间操作
  • 正则表达式
  • 中文输入法与React文本输入框的问题与解决方案
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Linux·i2c驱动架构​
  • ​MySQL主从复制一致性检测
  • ​如何在iOS手机上查看应用日志
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(串口助手-界面)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (6)添加vue-cookie
  • (C#)一个最简单的链表类
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740