我正在使用c#windows應用程序。檢查正在運行的應用程序的實例並殺死它
當我的應用程序啓動時,我想檢查相同應用程序的 taskmanager中的實例。如果有任何已經運行的實例,則會終止進程並啓動新進程。
這是爲了確保只有一個應用程序實例正在運行。
我正在使用c#windows應用程序。檢查正在運行的應用程序的實例並殺死它
當我的應用程序啓動時,我想檢查相同應用程序的 taskmanager中的實例。如果有任何已經運行的實例,則會終止進程並啓動新進程。
這是爲了確保只有一個應用程序實例正在運行。
下面是一個快速和骯髒的方法,以確保只有一個程序實例正在運行。祕密是使用互斥體。
[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);
}
此代碼試圖創建一個互斥鎖(互斥)具有一定的名字,如果它不能創建它,然後該程序的一個實例已經運行。
public Process[] ExistingProcesses()
{
string processName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(processName);
return processes;
}
對我來說,這聽起來很有侵略性,可能不是最好的主意。可能要maintain a single instance of your app。
請通過鏈接瞭解有關互斥解決方案的更多信息。 – 2009-07-13 05:24:28
而不是依賴進程名稱,即使偶然通過重命名可執行文件也可能失敗,檢查現有實例的傳統方法是使用命名句柄,例如互斥鎖。在啓動過程中,檢查它是否已經存在,如果有,立即關閉。
編輯
我剛剛看了一遍這個問題,這聽起來像你真的想殺死之前的實例,而不是殺死新的。我記得最接近這種行爲的是Google Chrome在打開新窗口時發生的情況,舊窗口沒有響應,但即使這樣也會檢查是否缺少響應,然後提示用戶。殺死舊的過程聽起來有點極端。你確定這就是你想要做的?
這段代碼需要一點工作,因爲它不處理被遺棄的互斥體 – 2009-07-13 05:31:48