可能重複:
What is the correct way to create a single instance application?
Prevent multiple instances of a given app in .NET?在.net中製作單實例應用程序的最佳方法是什麼?
檢查我的另一個進程是否具有相同名稱的存在? (如果用戶沒有權限這麼做?)
將文件寫入磁盤並在退出之前將其刪除? (什麼異常終止?)
這將是一個最佳做法做到這一點?
可能重複:
What is the correct way to create a single instance application?
Prevent multiple instances of a given app in .NET?在.net中製作單實例應用程序的最佳方法是什麼?
檢查我的另一個進程是否具有相同名稱的存在? (如果用戶沒有權限這麼做?)
將文件寫入磁盤並在退出之前將其刪除? (什麼異常終止?)
這將是一個最佳做法做到這一點?
您可以使用互斥鎖。
bool firstInstance = true;
using (Mutex mutex = new Mutex(true, "MyApplicationName", out firstInstance))
{
if (firstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
else
{
// Another instance loaded
}
}
可以使用Process
類的GetProcessesByName
方法去尋找另一個正在運行的進程具有相同的名稱,並退出,如果你找到一個。
通常,指定的互斥鎖效果最好。這裏是一個例子的鏈接:http://www.iridescence.no/post/CreatingaSingleInstanceApplicationinC.aspx
我依賴於你正在使用的技術。有相當多的解決方案,一些更適合WPF,有的爲的WinForms:
更多WindowsFormsApplicationsBase:
http://www.openwinforms.com/single_instance_application.html
更多的是互斥和測試過程:
http://www.ravinderweb.com/page/Single-Instance-of-the-Application-using-C-Trick-and-Mutex.aspx
我不會用一個文件,這是容易出現錯誤和沒有文件訪問,甚至可能會導致程序異常,即使它不是你的應用程序的重要組成部分。
有幾種方法可以做到這一點,所有這些方法都有其優點和缺點,谷歌搜索會給你很多關於它的討論。
你描述的方法有你提到的弱點。另外你需要考慮你想要多麼獨特您的實例是:
每WindowStation每臺機器
我有一個可以用來強制一個實例類每個WindowStation for Windows窗體應用程序。基本上,它使用的P/Invoke做啓動時以下,使用互斥對競爭條件保護:
定義一個固定唯一的字符串,以確定您的應用程序(如GUID)
獲得一個互斥體,其名稱來源於您的唯一字符串。
使用P/Invoke調用EnumWindows來枚舉所有主窗口。
在EnumWindows回調中,依次在每個窗口上使用P/Invoke調用GetProp,並將窗口句柄和唯一值作爲參數傳遞。如果GetProp檢測到具有唯一鍵(即應用程序的另一個實例)的窗口,請激活它(PostMessage(... SC_RESTORE ...),SetForegroundWindow,SetFocus),然後退出新實例。
如果枚舉所有窗口而不查找以前的實例,則使用P/Invoke調用SetProp爲應用程序的主窗體句柄設置唯一值。
釋放互斥鎖並繼續啓動。
在我的使用情況下,這種解決方案比單純持有過程中的壽命互斥,因爲如果用戶開始第二個實例,而不是在退出提供了一種方式來激活前一個實例更好。使用GetProp/SetProp爲您提供了一種在不依賴進程名稱的情況下識別流程實例的方法。
可能的重複:http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application – 2009-07-17 19:58:32
多個副本:http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application http://stackoverflow.com/questions/93989/prevent-multiple-instances-of-a-given-網絡應用程序http://stackoverflow.com/questions/906100/run-one-instance-from-the-application – Noldorin 2009-07-17 19:58:52