1. 程式人生 > 實用技巧 >C# 寫的windows服務程序守護實現

C# 寫的windows服務程序守護實現

C# 寫的windows服務程序守護實現

最近在做一個windows服務實現windows socket server讀取系統硬體,RFID的內容給WEB網站使用。在測試過程中,發現RFID讀取過程有時會導致服務無端中止。因為涉及到硬體呼叫,查不到具體的原因。所以就簡單的處理,做一個程序守護,當windows的服務程序退出之後,自動重新開啟。以前使用的方法是,另外做一個程式監測。因為那種方法比較麻煩,現在介紹一種更簡單的方法。使用cmd使用。

1. 首先建立複製一下內容。新建一個autostart.bat的指令碼檔案。

@echo off
rem 定義迴圈間隔時間和監測的服務:
set secs=60
set srvname="服務名稱"

echo.
echo ========================================
echo == 查詢計算機服務的狀態, ==
echo == 每間隔%secs%秒種進行一次查詢, ==
echo == 如發現其停止,則立即啟動。 ==
echo ========================================
echo.
echo 此指令碼監測的服務是:%srvname%
echo.

if %srvname%. == . goto end

:chkit
set svrst=0
for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1
if %svrst% == 0 net start %srvname%
set svrst=
rem 下面的命令用於延時,否則可能會導致cpu單個核心滿載。
ping -n %secs% 127.0.0.1 > nul
goto chkit

:end

雙擊該批處理檔案,執行介面如下

========================================
== 查詢計算機服務的狀態, ==
== 每間隔%secs%秒種進行一次查詢, ==
== 如發現其停止,則立即啟動。 ==
========================================

此指令碼監測的服務是:%srvname%


如果%srvname%停止後,該批處理檢測到後會重啟該服務,介面如下
========================================
== 查詢計算機服務的狀態, ==
== 每間隔%secs%秒種進行一次查詢, ==
== 如發現其停止,則立即啟動。 ==
========================================

此指令碼監測的服務是:%srvname%

%srvname% 服務正在啟動
%srvname% 服務已經啟動成功。

 

按實際情況修改
set srvname="服務名稱"
這裡的服務名稱。
把檔案儲存到服務的安裝資料夾。

2. C#相關程式碼

        /// <summary>
        /// 啟動服務
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            StartTimer();
        }

        System.Timers.Timer timer = new System.Timers.Timer();

        /// <summary>
        /// 啟動定時器
        /// </summary>
        private void StartTimer()
        {
           
            timer.Interval = 1000;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Start();
        }
        
        ///執行的
      void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!PortInUse(13001))
            {
                //LogOuts.Debug("open:"+1);
                //啟動socket
                StartWS();
            }
            else
            {
                //LogOuts.Debug("open:" + 2);
            }
            //如果沒執行命令,執行cmd監聽。
            if (!execdCmd)
            {
                execdCmd = true;
                execCmd();
            }
        }
        
                private bool execdCmd = false;
        private void execCmd()
        {
            Process proc = null;
            try
            {
                proc = new Process();
                proc.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory+ @"\\autostart.bat";
                proc.StartInfo.Arguments = string.Format("");//this is argument
                proc.StartInfo.CreateNoWindow = false;
                proc.Start();
                proc.WaitForExit();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
            }
        }