只运行一个实例的写法
有時(shí)我們需要只允許運(yùn)行應(yīng)用程序的一個(gè)實(shí)例,當(dāng)進(jìn)程啟動時(shí),如果發(fā)現(xiàn)應(yīng)用程序的一個(gè)實(shí)例在運(yùn)行,就自動停止運(yùn)行。我們通常通過Mutex互斥體在Main函數(shù)中實(shí)現(xiàn),通常的寫法是:
[STAThread]
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!");
}
}
}
我們在尋找答案時(shí),往往來去匆匆,根本不去理會Mutex的特性和注意事項(xiàng)。經(jīng)過簡單的測試,OK,拿來就用。此時(shí)我們忽略了一個(gè)重要的前提條件:Mutex的命名規(guī)則。以上的寫法在單用戶下運(yùn)行沒有問題;在多用戶下,每個(gè)用戶都能啟動一個(gè)實(shí)例,也就不能保證單實(shí)例運(yùn)行了。
如果需要在終端機(jī)服務(wù)器上使用,并且只允許一個(gè)實(shí)例的話,請使用下面的寫法:
[STAThread]
static void Main()
{
bool createNew;
try
{
using (System.Threading.Mutex m = new System.Threading.Mutex(true, "Global\\" + 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!");
}
}
}
catch
{
MessageBox.Show("Only one instance of this application is allowed!");
}
}
以下是MSDN的說明:
在運(yùn)行終端服務(wù)的服務(wù)器上,已命名的系統(tǒng) mutex 可以具有兩級可見性。如果名稱以前綴“Global\”開頭,則 mutex 在所有終端服務(wù)器會話中均為可見。如果名稱以前綴“Local\”開頭,則 mutex 僅在創(chuàng)建它的終端服務(wù)器會話中可見。在這種情況下,服務(wù)器上各個(gè)其他終端服務(wù)器會話中都可以擁有一個(gè)名稱相同的獨(dú)立 mutex。如果創(chuàng)建已命名 mutex 時(shí)不指定前綴,則它將采用前綴“Local\”。在終端服務(wù)器會話中,只是名稱前綴不同的兩個(gè) mutex 是獨(dú)立的 mutex,這兩個(gè) mutex 對于終端服務(wù)器會話中的所有進(jìn)程均為可見。即:前綴名稱“Global\”和“Local\”說明 mutex名稱相對于終端服務(wù)器會話(而并非相對于進(jìn)程)的范圍。
轉(zhuǎn)載于:https://www.cnblogs.com/lzxianren/archive/2013/06/16/3138507.html
總結(jié)
以上是生活随笔為你收集整理的只运行一个实例的写法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端开发小工具SuperApp——Ctr
- 下一篇: OSX系统编译cocos2dx andr