2008-10-03 26 views
5

保持機器我們有一個建立在C#中的SmartClient正在重新啓動其上運行的電腦時stubornly保持打開狀態。這會暫停重新啓動過程,除非用戶首先關閉SmartClient或進行其他手動干預。C#.NET的exe不會關閉,無法重新啓動

這是造成問題時,基礎架構團隊遠程安裝需要一臺機器重新啓動新的軟件。

用於獲取SmartClient的應用程序從Windows識別關機/重啓事件,並優雅地殺死自己的任何想法?

更新: 這是一個具有多個gui線程的高度線程化的應用程序。是的,多個gui線程。它真的是許多項目的合併,本身可以是獨立的應用程序 - 所有這些都是從一個集中管理方法並跟蹤這些線程的單個exe啓動和管理的。我不相信使用後臺線程是一種選擇。

+0

你在非後臺線程上運行的東西? – Will 2008-10-03 18:52:01

+0

您是否有權訪問SmartClient應用程序的源代碼? – 2008-10-03 19:17:14

回答

5

OK,如果你有應用程序的訪問,您可以處理SessionEnded事件。

... 
Microsoft.Win32.SystemEvents.SessionEnded +=new 
    Microsoft.Win32.SessionEndedEventHandler(shutdownHandler); 

... 

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) { 
    // Do stuff 
} 
0

通常一個.net應用程序至少會法正確迴應,這就是「開箱即用」的行爲。如果不是,可能會有很多事情正在進行。如果不瞭解關於程序的更多信息,我最好猜測的是,您在主UI線程中有一個長時間運行的進程,它阻止應用程序響應窗口消息。

+0

不是長時間運行的進程,但確實有上面提到的用於Catalin的Threading。儘管如此,這並不能真正回答這個問題 - 我真的正在尋找一種方法來檢測機器何時重新啓動。 – ScottCher 2008-10-03 19:03:58

1

或者.Net應用程序故意忽略關閉或退出消息?

+0

這是一個評論imo – Konstantinos 2009-04-07 12:29:18

5

它必須是一個繼續運行的線程,以防止應用程序關閉。如果你使用線程,一個簡單的解決方法是將其設置爲背景。

線程可以是一個背景線程或前臺線程。後臺線程與前臺線程完全相同,只是後臺線程不會阻止進程終止。一旦屬於某個進程的所有前臺線程都終止,公共語言運行庫就結束該進程。任何剩餘的後臺線程都會停止並且無法完成。

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

+0

的確,這是一個線程應用程序。查看原始帖子的更新。然而,鑑於我們正在對線程做什麼,是否將它們背景化仍然可行?即,多個GUI線程。 – ScottCher 2008-10-03 19:00:33

1

後臺線程是一個快速和骯髒的解決方案,最好的解決方法是使用同步對象(ManualResetEventMutex或別的東西),以阻止其他線程;

否則保持跟蹤你所有打開的窗口和發送WM_CLOSE消息時,主應用程序關閉。

您必須提供更多關於如何啓動這些GUI應用程序的信息。也許你爲每個應用程序啓動一個線程並致電Application.Run(new Form1());

您也可以考慮爲每個GUI應用程序

5

當用戶註銷或正在關閉Windows創建AppDomainWM_QUERYENDSESSION消息被髮送到所有頂級窗口。見MSDN documentation here.

響應此消息的WinForm應用程序的默認行爲是CloseReason == WindowsShutDown或其他觸發事件FormClosing。事件處理程序雖然可以選擇固執,並拒絕關閉應用程序,從而保持系統運行。

檢查FormClosing您的應用程序的處理程序。也許裏面有東西。我幾次見過這種東西。