2014-01-15 45 views
0

我正在測試一個簡單的Windows服務,它檢測應用程序是否正在響應並將結果寫入文件。Windows服務檢測應用程序沒有響應?

在調試期間一切正常,但一旦我發佈服務,它不會檢測到應用程序掛起?它仍然寫入文件沒有問題,但由於某種原因,響應檢查不會觸發。好像我忽略了什麼?

// Start方法

protected override void OnStart(string[] args) 
    { 
     var worker = new Thread(DoWork); 
     worker.Name = "MyWorker"; 
     worker.IsBackground = false; 
     worker.Start(); 

    } 

//做工作

void DoWork() 
    { 

     string curFile = AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt"; 

     Process[] runningProcs = Process.GetProcessesByName("TestApp"); 

     if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt")) 
     { 
      File.Delete(curFile); 
     } 

     while (runningProcs.Length > 0) 
     { 
      System.Threading.Thread.Sleep(2500); 

      foreach (Process checkProc in runningProcs) 
      { 

       if (checkProc.Responding) 
       { 
        File.AppendAllText(curFile, "Application is Responding @ " + DateTime.Now + System.Environment.NewLine); 



       } 

       else 
       { 
        File.AppendAllText(curFile, "Application is Not Responding @ " + DateTime.Now + System.Environment.NewLine); 

       } 
      } 



     } 
    } 

調試輸出:

應用程序是響應@ 2014年1月15日8 :59:40 AM

應用程序是響應@ 2014年1月15日上午08點59分43秒

應用程序是響應@ 2014年1月15日上午08點59分45秒

應用程序沒有響應@15分之1/ 2014上午08時59分53秒

應用程序沒有響應@ 2014年1月15日上午08點59分55秒

應用程序沒有響應@ 2014年1月15日上午08點59分58秒

服務產出:

應用程序是響應@ 2014年1月15日上午09時03分02秒

應用程序是響應@ 2014年1月15日上午09時03分05秒

應用程序是響應@ 1/15/2014上午09時03分07秒

應用程序是響應@ 2014年1月15日上午9時03分10秒

應用程序是響應@ 2014年1月15日上午09時03分12秒

+0

您是否將該服務作爲與桌面交互的服務運行?記住服務通常使用與普通用戶界面不同的窗口站運行,並查看它所說的Process.Responding文檔*如果進程具有用戶界面,則Responding屬性聯繫用戶界面以確定進程是否響應到用戶輸入* – Lloyd

+0

我不這麼認爲,除非交互是在Visual Studio 2010中創建Windows服務時的默認值? – Blake

+0

我不這麼認爲,至少不是我見過的。看到這裏的更多信息http://stackoverflow.com/questions/4237225/windows-service-allow-service-to-interact-with-desktop但它聽起來像可能已經改變以及後Vista。 – Lloyd

回答

1

按照屬性的文檔Process.Responding獲取一個值,指示進程的用戶界面是否響應。我期望在封面下,它調用EnumWindows()或EnumThreadWindows()來查找與該進程關聯的窗口,然後在每個窗口上調用SendMessageTimeout()以查看是否有響應。

不幸的是,這對您的Windows服務提出了一個問題,由於Session 0 Isolation,它與您希望檢查的進程沒有在同一個會話中運行。該服務對EnumWindows()的調用只會返回Session 0中的窗口,其中沒有一個會用於在Session 1或更高版本中運行的應用程序。找到沒有窗口就足以回答'真',因爲它不知道更好。

事情調試時,因爲您的應用程序和圖形用戶界面運行在同一會話和EnumWindows()找到窗口按預期。