首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 開發 Windows Service 監控系統啟動/關機時間

     編輯:關於C語言

前言

Windows 服務在背景長期執行、無需使用者互動,適合記錄系統啟動、關機時間等監控需求。本文示範以 C# 建立 Windows Service,將啟動/關機時間寫入 XML,再以 WebForm + DataGrid 顯示統計報表。

專案建立步驟

  1. Visual Studio → 新增專案 → Windows Service → 命名 Monitoring。
  2. 將 Service1.cs 重命名 Monitoring.cs,類別名同步修改。
  3. 加入 System.IO, System.Xml 命名空間。

服務核心程式碼

public partial class Monitoring : ServiceBase
{
    private DateTime _startTime;
    private const string XmlPath = @"C:\file1.xml";

    public Monitoring() => InitializeComponent();

    protected override void OnStart(string[] args)
    {
        _startTime = DateTime.Now;
        WriteStartEntry();
    }

    protected override void OnShutdown()
    {
        WriteShutdownEntry();
    }

    private void WriteStartEntry()
    {
        // 確保 XML 根節點存在
        if (!File.Exists(XmlPath))
        {
            File.WriteAllText(XmlPath, "");
        }

        var doc = new XmlDocument();
        doc.Load(XmlPath);
        var timeEl = doc.CreateElement("time");
        timeEl.AppendChild(CreateElement(doc, "Date", DateTime.Now.ToString("dd-MM-yy")));
        timeEl.AppendChild(CreateElement(doc, "Started", DateTime.Now.ToString("t")));
        doc.DocumentElement.AppendChild(timeEl);
        doc.Save(XmlPath);
    }

    private void WriteShutdownEntry()
    {
        var doc = new XmlDocument();
        doc.Load(XmlPath);
        var lastTime = doc.DocumentElement.LastChild; // 最近一筆 

安裝程式設定

  1. 設計介面右鍵 → Add Installer,產生 ProjectInstaller.cs。
  2. serviceProcessInstaller1.Account = ServiceAccount.LocalSystem。
  3. serviceInstaller1.DisplayName = serviceInstaller1.ServiceName = "Monitoring"。
  4. serviceInstaller1.StartType = ServiceStartMode.Automatic。
  5. 屬性視窗將 CanShutdown = true, CanStop = true。

安裝與測試

// 開發人員命令提示字元
cd bin\Debug
installutil Monitoring.exe
// 成功顯示 "Commit Phase Completed Successfully"

重啟電腦 → 服務自動啟動 → 關機 → 查看 C:\file1.xml 記錄。

WebForm 顯示報表

protected void Page_Load(object sender, EventArgs e)
{
    string tempXml = @"C:\temp1.xml";
    File.Copy(@"C:\file1.xml", tempXml, true);

    // 補全未關機的記錄
    var doc = new XmlDocument();
    doc.Load(tempXml);
    var lastTime = doc.DocumentElement.LastChild;
    if (lastTime != null && lastTime["Shutdown"] == null)
    {
        lastTime.AppendChild(CreateElement(doc, "Shutdown", "undefined"));
        lastTime.AppendChild(CreateElement(doc, "TimeSpent", "undefined"));
    }
    doc.Save(tempXml);

    // 繫結 DataGrid
    var ds = new DataSet();
    ds.ReadXml(tempXml);
    DataGrid1.DataSource = ds;
    DataGrid1.DataBind();

    // 計算總時長
    double totalHours = 0;
    using (var reader = new XmlTextReader(tempXml))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name == "TimeSpent")
            {
                string val = reader.ReadInnerXml();
                if (val != "undefined" && TimeSpan.TryParse(val.Replace(".", ":"), out TimeSpan ts))
                    totalHours += ts.TotalHours;
            }
        }
    }
    Response.Write($"Total Duration: {Math.Floor(totalHours)} Hours {(totalHours % 1) * 60:F0} Minutes");

    File.Delete(tempXml);
}

改進建議

  • 並發存取:XML 檔案讀寫需加鎖(lock 或 Mutex),避免服務與網頁同時存取衝突。
  • 資料庫替代:生產環境建議改用 SQLite / SQL Server LocalDB,支援並發查詢與索引。
  • 事件日誌:搭配 EventLog 寫入系統日誌,方便 IT 稽核。
  • .NET Core / Worker Service:現代專案改用 BackgroundService 部署為 Linux systemd 或 Windows 服務,跨平台更彈性。

結語

Windows Service 是長期背景作業的經典選擇。本文完整示範從服務建立、XML 記錄、安裝部署到 Web 報表呈現的流程。實務上應依據資料量、並發需求選擇適當儲存介質,並加強錯誤處理與日誌記錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved