雙擊一個WinForm程序,會打開一個界面,也即運行了一個程序的實例;雙擊多次的時候,會出現多個程序界面。有時候我們需要只允許程序只能同時運行一個實例。實現方式有很多。
一. 進程互斥
原理:通過獲取系統進程列表,如果發現有重名的,則表示程序已經運行了,此時新運行的進程就退出;
實現:System.Diagnostics.Process類的靜態方法GetProcessesByName(string processName)
Process[] ps = Process.GetProcessesByName( (ps != && ps.Length >
寫在Main方法裡;判斷Length大於1,是因為本身啟動之後也在進程列表裡了,第一次啟動的時候Length==1;
優點:代碼簡單;
缺點:會把別的重名程序誤認為是自己(如很多軟件都有update.exe);可以通過復制多個exe並起不同名字來達到運行多個實例的目的;
二. 共享鎖(文件、注冊表)
原理:運行程序時,在一個公共的位置創建一個共享值(如在固定目錄創建一個文件,或者在固定的注冊表位置創建一個值),退出程序時刪除該值。若運行時發現值已經在,則表示程序已經在運行,此時新運行的進程就退出;
實現:略;
優點:邏輯好理解;
缺點:若程序沒有正常退出,共享值沒有被刪除,會導致程序無法再啟動;
三. 線程互斥
原理:通過一個唯一標識創建進程互斥體,啟動時判斷互斥體是否已經存在,若存在則表示是重復進程;
實現:使用System.Threading.Mutex
Main( Attribute guid_attr = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), guid == System.Threading.Mutex(, guid, ( ==
優點:真正能做到同一個程序只允許運行一個進程;
缺點:暫無