第二步:
按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中。以後,我創建邏輯來查找所有花費的時間。
我非常希望每個人都能理解上面的代碼。
上面頁面的輸出結果大致如下圖所示: