2009-07-13 103 views
1

我正在使用c#windows應用程序。檢查正在運行的應用程序的實例並殺死它

當我的應用程序啓動時,我想檢查相同應用程序的 taskmanager中的實例。如果有任何已經運行的實例,則會終止進程並啓動新進程。

這是爲了確保只有一個應用程序實例正在運行。

回答

1

下面是一個快速和骯髒的方法,以確保只有一個程序實例正在運行。祕密是使用互斥體。

[STAThread] 
static void Main()     
{ 
    bool ok; 
    m = new System.Threading.Mutex(true, "YourNameHere", out ok); 

    if (!ok) 
    { 
     MessageBox.Show("Another instance is already running."); 
     return; 
    } 

    // Do some stuff here... 

    GC.KeepAlive(m);     
} 

此代碼試圖創建一個互斥鎖(互斥)具有一定的名字,如果它不能創建它,然後該程序的一個實例已經運行。

+0

這段代碼需要一點工作,因爲它不處理被遺棄的互斥體 – 2009-07-13 05:31:48

0
public Process[] ExistingProcesses()  
{ 
    string processName = Process.GetCurrentProcess().ProcessName; 
    Process[] processes = Process.GetProcessesByName(processName); 
    return processes; 
} 
1

對我來說,這聽起來很有侵略性,可能不是最好的主意。可能要maintain a single instance of your app

+0

請通過鏈接瞭解有關互斥解決方案的更多信息。 – 2009-07-13 05:24:28

0

而不是依賴進程名稱,即使偶然通過重命名可執行文件也可能失敗,檢查現有實例的傳統方法是使用命名句柄,例如互斥鎖。在啓動過程中,檢查它是否已經存在,如果有,立即關閉。

編輯

我剛剛看了一遍這個問題,這聽起來像你真的想殺死之前的實例,而不是殺死新的。我記得最接近這種行爲的是Google Chrome在打開新窗口時發生的情況,舊窗口沒有響應,但即使這樣也會檢查是否缺少響應,然後提示用戶。殺死舊的過程聽起來有點極端。你確定這就是你想要做的?

相關問題