C# 實現程序只啟動一次(實現程序自重啟)


程序運行過程中,不能有多個實例運行,並且需要程序自己可以重啟(重新運行),所以代碼如果下代碼:

static void Main() 
{ 
    bool createNew; 
    using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew)) 
    { 
        if (createNew) 
        { 
            Application.EnableVisualStyles(); 
            Application.SetCompatibleTextRenderingDefault(false); 
            Application.Run(new Form1()); 
        } 
        else 
        { 
            MessageBox.Show("Only one instance of this application is allowed!"); 
        } 
    } 
} 


Boolean createdNew; //返回是否賦予了使用線程的互斥體初始所屬權
System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元變量
if (createdNew) //賦予了線程初始所屬權,也就是首次使用互斥體
{
Application.Run(new Form1()); /s/這句是系統自動寫的
instance.ReleaseMutex();
}
else
{
MessageBox.Show("已經啟動了一個程序,請先退出!","系統提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
Application.Exit();
}

用以上代碼實現了禁止多重啟動的功能。
同時程序關閉重啟是通過下面的代碼實現的:
Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
Application.Exit();
這時就出現一個問題,程序自動關閉重啟的時候就會提示已經啟動了一個程序了。
請問應該怎么解決?
關閉之后過一會兒再啟動是沒問題的。
但是現在自動關閉,自動重啟有的時候能成功,有的時候就被禁止多重啟動的那個截住了。
那就必須手動重新啟動了。
比如,點【重新啟動】按鈕的時候執行以下代碼:
Process.Start(Process.GetCurrentProcess().ProcessName + ".exe");
Application.Exit();
這時它是先啟動一個新的Process然后才退出當前程序。
這時就會在Program.cs里遇到禁止多重啟動的那段代碼。就不能自動啟動了

解決方案
-----------------------------
解決方法一:
一般程序:
因為進程還沒有中止,還占在內存中所以才會報錯.
出現這種原因的情況可能是:使用多線程,其中的線程沒有執行結束,也沒有被置為后台線程,所以雖然應用程序關閉,但進程仍駐留在內存中.
可以使用Application.ExitThread();中止進程中的所有線程.
也可以在進程執行中獲得進程的ID,然后通過Process.GetProcessById()獲得這個進程,然后將它Kill掉,再啟動新的進程.

解決方法二:
要不就在用戶點[重新啟動]時,把mutex先釋放掉?可能需要把那個mutex變量做成一個global,這樣你在兩個地方都能訪問到。然后在程序退出時(Application.Run下面那一句),檢查一下如果mutex已經被釋放了,就不要再釋放了。

解決方法三:
或者就在點[重新啟動]時再設另外一個不同的信號量,當第二個程序重入時如果看到這個信號量說明是自動重啟的情況,就不報錯而直接正常往下走了。這個信號量可以在第一個程序[重新啟動]那里執行完后再釋放,不過應該也可以在整個程序退出時檢查一下如果存在就釋放。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM