2010-02-08 20 views
1

我正在開發託管遠程對象的長時間運行的進程。由於設計限制,我無法使用Windows服務,因此該過程是背景Forms應用程序。我也不能使用WPF,因爲我們僅限於.Net 2.0。在任何情況下,由於不能保證後臺進程正在運行,我希望能夠從可以從另一個進程中檢查的進程設置系統範圍標誌。.Net系統寬標記以確定應用程序/線程是否正在運行

我讀了,並嘗試使用Mutex的,但似乎沒有辦法確定互斥體是否存在,而不創建它,如果它不存在(除非我失去了一些東西,這總是可能的)。理想情況下,長期運行的應用程序所確定的系統變量的生命週期是理想的,不僅是信號是否運行,也可能用於存儲基本狀態數據(如簡單整數枚舉)。

任何人都可以提出一個很好的方法來實現這一目標嗎?

+0

是的,你應該使用Mutex的。但前幾天我失敗了,所以我不會給出答案:) 此外,您可能需要全局互斥鎖,如MSDN中所述。 – leppie 2010-02-08 13:58:29

+0

我在想同樣的事情,但最大的問題是,如果我使用Mutex.OpenExisting並定義了互斥鎖,則客戶端應用程序將獲得它的所有權,並在該線程結束時釋放,這不會起作用。這使我認爲使用互斥鎖並不一定是正確的方法。 – Jason 2010-02-08 14:04:03

回答

1

是的,使用Mutex類。你需要Mutex(bool,string,out bool)構造函數,最後一個「createdNew」參數告訴你互斥量是否還沒有創建。如果希望能夠檢測任何會話(包括服務和遠程登錄)中正在運行的程序的任何版本,請在「global \」前加上互斥體的名稱。

+0

我試過這種方法。問題是如果第二個應用程序不存在,那麼它將創建互斥鎖,然後它的生命週期將由該線程控制。這是不正確的,只能通過長時間運行的主機應用程序來控制生命週期。我現在正在尋找在長時間運行的應用程序中添加Mutex Rights並嘗試OpenExitsting。這應該會導致第二個應用程序出現異常...... – Jason 2010-02-08 14:10:24

+0

您需要將其設置爲靜態,以便其生命週期由進程控制(AppDomain,真的)。不是主機進程的輔助進程。 – 2010-02-08 15:43:39

0

所以在互斥體上使用訪問控制似乎是答案。下面是我做的:

在長期運行過程

 Dim MutextWasCreated As Boolean 

     ' Create a security rule for the mutex so other threads cannot take ownership 
     Dim MutexSec As New MutexSecurity 
     Dim rule As New MutexAccessRule(Environment.UserDomainName & "\" & Environment.UserName, MutexRights.TakeOwnership, AccessControlType.Deny) 

     MutexSec.AddAccessRule(rule) 

     App_Mutex = New Mutex(True, "Global\MyMutexName}", MutextWasCreated, MutexSec) 
     App_Mutex.WaitOne(-1, True) 

然後,在客戶端應用程序,使用以下方法來嘗試打開互斥:從你的主要過程

  Dim HostIsRunning As Boolean 

     Try 
      Mutex.OpenExisting("Global\MyMutexName", AccessControl.MutexRights.TakeOwnership) 
     Catch ex As Exception 
      If TypeOf ex Is UnauthorizedAccessException Then 
       ' The mutex is created by the host to dissalow other threads from taking ownership. If we get this exception, we know the mutext has been created, thus the app is running. 
       HostIsRunning = True 
      ElseIf TypeOf ex Is WaitHandleCannotBeOpenedException Then 
       HostIsRunning = False 
      Else 
       Throw ex 
      End If 
     End Try 
0

與遠程處理samething作爲

MyProcessInfo暴露:MarshalByRef { 布爾IsRunning() { 返回true; }}

如果遠程調用拋出異常「找不到服務MyProcessInfo.rem」(我不記得確切的話),這個過程是不活躍的,如果你願意,你可以返回相同的信息作爲你的簡單整數枚舉

相關問題