2009-05-21 122 views
0

我在管理我的應用程序和外部服務之間的連接的服務器應用程序中構建組件。我的組件檢測服務器何時不可用,啓動後臺線程直至服務可用,然後重新進入「工作」狀態。如何檢測應用程序關閉?

我的問題是,如果在此線程運行時調用該組件的進程退出,則應用程序將不會終止,直到線程退出。基本上,如果此服務可用,我的應用程序無法關閉。

我的問題:是否有一些方法來檢測應用程序是否試圖關閉,以便任何後臺線程可以退出?我注意到了AppDomain類中的一些事件,但我不確定在哪些條件下以及在哪些環境中它們會被解僱。

因爲這是一個低級別的組件,所以我不想讓它知道它運行的環境,而且我也不希望更高級別的組件需要告訴它它正在關閉。

該組件將用於WCF服務和Windows服務應用程序,並且我還從WinForm客戶端應用程序進行測試。

回答

0

「因爲這是一個低級別的組件,所以我不想讓它知道它運行的環境的任何內容,而且我不希望更高級別的組件需要告訴它它正在關閉。」

這兩個要求有衝突。組件必須能夠告訴應用何時關閉(在這種情況下,它必須知道它運行的環境),或者一些更高級別的組件(它瞭解環境)必須告訴它去關機。沒有其他選擇。

在我看來,組件應儘可能少地假設它們將如何使用。例如,他們不應該假定他們將在應用程序的整個生命週期中使用,但可以根據應用程序的需要隨時啓動和停止。即使事實證明組件的唯一使用方式是在應用程序的整個生命週期中,這種方法都會導致更清潔的設計。因此,我會說正確的方法是讓應用程序告訴組件何時不再需要,並且它應該自行終止,無論應用程序是否正在關閉。我也會說這是設計組件時的典型方法。

1

如果您需要處理更低級別的事情,也許您需要您的組件來監視應用程序關閉事件。 此代碼用於監視關閉的進程。 (如果有人從任務管理器執行結束任務,它也將工作。)

Process MyMonitoredProcess = null; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    Process[] p = Process.GetProcessesByName("processName", "machineName"); 
    if (p.Length > 0) 
    { 
     MyMonitoredProcess = p[0]; 
     MyMonitoredProcess.EnableRaisingEvents = true; 
     MyMonitoredProcess.Exited += TestProcessEndedEvent; 
    } 

} 

private void TestProcessEndedEvent(object sender, System.EventArgs e) 
{ 
    // Tasks to be done if application closes. 
} 

希望這有助於。