2009-06-30 88 views
3

我使用我怎麼重新啓動一個實例WinForms應用程序

Application.Restart();

問題,我重新開始每天早上2點的應用是一個檢查了幾個星期後顯示,有6或者正在運行的實例。

我嘗試用

bool IsOwned; 
Mutex m = new Mutex(true, Name, out IsOwned); 
if (!IsOwned) 
     Environment.Exit(0); 

限制實例數但這並沒有因爲出於某種原因,最近停止實例仍可見工作......或至少這是我的理解,併爲導致應用程序沒有重新啓動。

我哪裏出錯了?

回答

3

確保您在應用程序退出事件上掛接了釋放互斥鎖並關閉它的方法。

2

首先...爲什麼你需要每天重新啓動一個應用程序?

我猜這是一個比每天凌晨2點重新開始自己的應用程序更好的解決方案。

例如,您可能有內存泄漏......如您的評論中所述。解決這個問題可能更適合集中您的努力。預先重新啓動應用以避免內存泄漏將被大多數程序員考慮,包括我自己在內的黑客。

+1

這與問題有什麼關係?事實是我想每天凌晨2點重新開始。 – Brad 2009-06-30 13:52:35

2

我在過去碰到過這個問題,我認爲問題在於正在運行的實例獲取關閉的互斥體在第二個實例的互斥體之前沒有被釋放,開始檢查它。爲了解決這個問題,我所做的是提供了一種方法,將控制權交還給我的主窗體並顯示重新啓動;因此重新啓動的關閉部分不必執行除退出之外的任何任務。

3

任何機會,你使用多個線程?如果你不關閉後臺線程,它們將保持你的進程運行,即使通過調用Application.Restart。

我粘貼了下面的一些代碼來演示這種行爲。要查看它,請使用下面的代碼編譯一個測試項目並運行它。 (您需要在窗體上放置1個按鈕,並指定我在下面的代碼中定義的點擊處理程序)。

啓動任務管理器,轉到進程選項卡,並確保將PID(進程ID)列添加到視圖。

每次單擊該按鈕時,應用程序都會重新啓動,但您應該會看到舊進程仍然掛在內存中(由於後臺線程未關閉)。

 

    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // start a background thread that will never be exited. 
      System.Threading.Thread thread = new System.Threading.Thread(delegate() { while (true) System.Threading.Thread.Sleep(1000); }); 
      thread.Start(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Application.Restart(); 
     } 
} 
 

假設這是你的問題,糾正它是把某種支票到您的後臺線程(甚至一個bool標誌將做)的最佳方式。讓他們定期檢查退出,並在應用程序關閉時正常退出。

注意:您可以將線程的背景屬性設置爲true,並且它會自動退出,但如果這樣做,則無法控制線程退出時執行哪條指令,因此您可以'執行任何類型的清理。最好編寫自己的支票。

相關問題