2014年1月20日 星期一

Windows Service 控制介面

ServiceController這個類別可以用來控制Service的狀態
詳細的資訊請參考MSDN上面的文件

新增一個Windows Form應用程式來當範例

首先要先參考System.ServiceProcess這個元件

簡單拉兩個按鈕來控制啟動或停止服務

在Button Click事件中,透過ServiceController來切換狀態
private void Btn_Start_Click(object sender, EventArgs e)
{
    // 設定服務
    using (ServiceController objSC = new ServiceController("Service1"))
    {
        // 設定一個 Timeout 時間,若超過 30 秒啟動不成功就宣告失敗
        TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 30);

        // 啟動服務
        objSC.Start();

        // 設定該服務必須在timeout時間內切換到Running狀態
        objSC.WaitForStatus(ServiceControllerStatus.Running, timeout);
    }
}

private void Btn_Stop_Click(object sender, EventArgs e)
{
    // 設定服務
    using (ServiceController objSC = new ServiceController("Service1"))
    {
        // 若該服務不是「停用」的狀態,才將其停止運作,否則會引發 Exception  
        if (objSC.Status != ServiceControllerStatus.Stopped && objSC.Status != ServiceControllerStatus.StopPending)
        {
            // 設定一個 Timeout 時間,若超過30秒停止不成功就宣告失敗!  
            TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 30);

            // 停止服務
            objSC.Stop();

            // 設定該服務必須在timeout時間內切換到Stopped狀態
            objSC.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
        }
    }
}

再拉個按鈕來發送自訂命令

透過ExecuteCommand來發送命令,需要注意這裡面的CommandID必須在128~256這個範圍
private void Btn_CMD_128_Click(object sender, EventArgs e)
{
    // 設定服務
    using (ServiceController objSC = new ServiceController("Service1"))
    {
        if (objSC.Status == ServiceControllerStatus.Running)
        {
            objSC.ExecuteCommand(128);
        }
    }
}

在Service中去覆寫OnCustomCommand,就可以收到發送命令的通知
至於收到什麼編號要去做什麼行為,簡單地用個switch case就行了
protected override void OnCustomCommand(int command)
{
    switch (command)
    {
        case 128:
            break;
        case 129:
            break;
        case 130:
            break;
        default:
            break;
    }
}