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

C# 開發 Windows Service 程序(上):日誌檢視器與服務控制實作

     編輯:關於C語言

日誌列表載入與顯示

表單載入時檢查服務是否安裝,並自動重新整理日誌列表:

private void frmViewLog_Load(object sender, EventArgs e) {
    try {
        ServiceController ctrl = new ServiceController("MyFileSystemWatcher");
        var status = ctrl.Status; // 若無例外代表已安裝
        ctrl.Dispose();
        bolServiceInstalled = true;
    } catch (Exception ex) {
        lblServiceInstall.Text = "服務尚未安裝";
        myTimer.Enabled = false;
        btnStartService.Enabled = false;
        btnStopService.Enabled = false;
        bolServiceInstalled = false;
        MessageBox.Show(this, "服務尚未安裝:" + ex.Message, "系統錯誤");
    }
    btnRefresh_Click(null, null);
}

重新整理列表邏輯

查詢 FileSystemLog 資料表,依 EventStyle 設定圖示與分組:

private void btnRefresh_Click(object sender, EventArgs e) {
    this.Cursor = Cursors.WaitCursor;
    lvwRecord.BeginUpdate();
    try {
        lvwRecord.Items.Clear();
        using (IDbCommand cmd = Util.DBConnection.CreateCommand()) {
            cmd.CommandText = "SELECT RecordID, ObjectName, WatchTime, EventStyle FROM FileSystemLog ORDER BY WatchTime";
            using (IDataReader reader = cmd.ExecuteReader()) {
                while (reader.Read()) {
                    ListViewItem item = new ListViewItem();
                    item.Tag = reader.GetValue(0).ToString();
                    item.Text = reader.GetValue(1).ToString();
                    item.SubItems.Add(reader.GetValue(2).ToString());
                    string style = reader.GetValue(3).ToString().Trim().ToLower();
                    item.SubItems.Add(style);

                    switch (style) {
                        case "created": item.Group = lvwRecord.Groups[0]; item.ImageIndex = 0; break;
                        case "changed": item.Group = lvwRecord.Groups[1]; item.ImageIndex = 1; break;
                        case "deleted": item.Group = lvwRecord.Groups[2]; item.ImageIndex = 2; break;
                        case "renamed": item.Group = lvwRecord.Groups[3]; item.ImageIndex = 3; break;
                    }
                    item.StateImageIndex = item.ImageIndex;
                    lvwRecord.Items.Add(item);
                }
            }
        }
        myStatus.Text = $"共列出 {lvwRecord.Items.Count} 個記錄";
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString(), "系統錯誤");
    } finally {
        this.Cursor = Cursors.Default;
        lvwRecord.EndUpdate();
    }
}

刪除記錄功能

利用 ListViewItem.Tag 保存的 RecordID 組合 SQL 刪除:

private void btnDelete_Click(object sender, EventArgs e) {
    if (lvwRecord.SelectedItems.Count > 0) {
        using (IDbCommand cmd = Util.DBConnection.CreateCommand()) {
            for (int i = lvwRecord.Items.Count - 1; i >= 0; i--) {
                ListViewItem item = lvwRecord.Items[i];
                if (item.Selected) {
                    cmd.CommandText = $"DELETE FROM FileSystemLog WHERE RecordID = '{item.Tag}'";
                    cmd.ExecuteNonQuery();
                    lvwRecord.Items.Remove(item);
                }
            }
        }
    }
}

服務啟動/停止控制

透過 ServiceController 非同步發送控制指令:

private void btnStartService_Click(object sender, EventArgs e) {
    if (!bolServiceInstalled) return;
    using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
        if (ctrl.Status == ServiceControllerStatus.Stopped) ctrl.Start();
    }
}

private void btnStopService_Click(object sender, EventArgs e) {
    if (!bolServiceInstalled) return;
    using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
        if (ctrl.Status == ServiceControllerStatus.Running) ctrl.Stop();
    }
}

定時器同步按鈕狀態

每 2 秒檢查服務狀態,啟用/停用對應按鈕:

private void myTimer_Tick(object sender, EventArgs e) {
    if (!bolServiceInstalled) return;
    using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
        btnStartService.Enabled = (ctrl.Status == ServiceControllerStatus.Stopped);
        btnStopService.Enabled = (ctrl.Status == ServiceControllerStatus.Running);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved