監控服務(Service)的目前狀態

一般撰寫完Service程式之後,Service都是在背景持續的作業,前景部分是不會看到任何的介面的,那麼就會有一些延伸的需求產生。例如說如何知道目前Service的狀態,或是怎麼從Service中取出一些目前運作的訊息等等;這邊就先來看看要怎麼去取得Service的狀態

一般撰寫完Service程式之後,Service都是在背景持續的作業,前景部分是不會看到任何的介面的,那麼就會有一些延伸的需求產生。例如說如何知道目前Service的狀態,或是怎麼從Service中取出一些目前運作的訊息等等;這邊就先來看看要怎麼去取得Service的狀態。

 

要取得目前服務的狀態其實在實作上非常的簡單,只要利用ServiceController的功能就可以達到了,例如下面這個範例可以列出目前系統中的所有服務以及該服務是否支援『停止』的動作

 

using System;
using System.ServiceProcess;
using System.Windows.Forms;
 
namespace svcMonitor
{
    public partial class Form1 : Form
    {
 
        ServiceController[] svcList;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            svcList = ServiceController.GetServices();
            foreach (var item in svcList)
            {
                txtMessage.Text +=
                   item.ServiceName + " : " + item.Status.ToString() + Environment.NewLine;
                txtMessage.Text +=
                   "    " + item.ServiceName + " : " + item.CanStop + Environment.NewLine;
            }
        }
    }
}

 

從這邊可以看出,直接呼叫ServiceController.GetServices,就可以取回系統的服務清單,之後如果想要只去管理自己的Service時,利用ServiceName的屬性來過濾就可以了。

 

而ServiceController.GetServices傳回的是ServiceController的陣列,取得之後,就可以呼叫方法來啟動或是停止Service,例如說稍微修改一下上面的程式碼

 

private void btnRefresh_Click(object sender, EventArgs e)
{
    svcList = ServiceController.GetServices();
    foreach (var item in svcList)
    {
        if (item.ServiceName == "MyServiceName")
        {
            if (item.Status != ServiceControllerStatus.Running)
            {
                item.Start()
            }
        }
    }
}

 

這樣就可以判斷如果Service不是在執行中的狀態的話,就把Service給啟動起來;是不是非常簡單呢 :)