2011-11-16 93 views
2

我寫了一個小型C#控制檯應用程序,供許多用戶在共享存儲服務器上使用。它的運行時間應該總是在3秒鐘左右<,並在後臺自動運行,以幫助用戶真正嘗試使用的另一個GUI應用程序。因此,我想確保程序總是完全退出,不管它是否引發錯誤或不是。如何確保C#控制檯程序總是退出?

在Application_Startup,我的基本結構:

try 
{ 
    // Calls real code here 
} 
catch 
{ 
    // Log any errors (and the logging itself has a try with empty catch around it 
    // so that there's no way it can causes problems) 
} 
finally 
{ 
    Application.Shutdown(); 
} 

我想,通過這種結構,它是不可能的,我的應用程序成爲殭屍進程。但是,當試圖推送此應用程序的新版本時,我反覆發現我無法刪除並替換可執行文件,因爲「文件正在使用」,這意味着它掛在別人的計算機上,即使它只應該運行幾秒鐘,並始終關機。

那麼,我的應用程序似乎正在成爲人們使用我的代碼結構的計算機上的一個掛起進程?我錯過了什麼?

編輯:添加了「應用程序」。爲了清晰起見解決ShutDown()。

+3

不要從共享驅動器運行應用程序。在主應用程序中包含一些升級邏輯,以將控制檯應用程序複製到本地計算機,或將邏輯移動到主應用程序中,以便在單獨的線程上運行。 –

+0

'ShutDown()'究竟發生了什麼? –

+0

@KyleTrauberman,我認爲你是對的,我將把它放在後面,但我仍然想知道確保C#應用程序始終關閉的最佳實踐/最佳方法,無論出現什麼錯誤或什麼情況。 – JoeCool

回答

2

有兩個選項:

  1. 控制檯應用程序並沒有真正完成在3秒內,而是需要很多時間。你需要調試它,看看需要多長時間。
  2. 您的控制檯應用程序需要3秒鐘才能退出,但GUI會每分鐘運行一次,並且您有超過40個用戶,因此找到未使用的可執行文件的可能性很小。

如果它是第一個,並且你不想調試它,你總是可以啓動第二個線程,等待3秒鐘,然後殺死整個過程。

1

也許try塊內部的代碼仍然對至少一個客戶端執行,並且實際上並不僅限於3秒左右。爲了防止出現這種情況,您需要多線程應用程序 - 一個用於處理的線程,另一個用於後臺在超時後終止工作線程。在此之前,您應該問問自己是否真的需要這樣的基礎設施。

想到的另一件事是,其中一個用戶目前正在運行應用程序,其概率取決於您的用戶數量。

也許將您的支持應用程序設計爲始終運行的多線程服務將是一個更好的主意,而不是爲每個客戶端請求實例化一個正在運行的應用程序。

相關問題