用C#開發Windows服務監控系統使用

weixin_34304013發表於2009-07-28

摘要 本文將向你展示如何用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://blog.csdn.net/teng_s2000/archive/2006/07/26/979422.aspx

相關文章