我們在做程序時,有時候希望在一臺電腦上面只有一個進程實例在運行,利用Mutex互斥量可以實現了這個功能,方法及步驟如下:
接下來分控制檯程序和Winform程序兩種情況下實現此功能
1.控制檯程序
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace myConApp
- {
- class Test
- {
- /// <summary>
- /// 應用程序的主入口點。
- /// </summary>
- [STAThread]
- static void Main(string[] args)
- {
- bool flag = false;
- System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
- //第一個參數:true--給調用線程賦予互斥體的初始所屬權
- //第一個參數:互斥體的名稱
- //第三個參數:返回值,如果調用線程已被授予互斥體的初始所屬權,則返回true
- if (flag)
- {
- Console.Write("Running");
- }
- else
- {
- Console.Write("Another is Running");
- System.Threading.Thread.Sleep(5000);//線程掛起5秒鐘
- Environment.Exit(1);//退出程序
- }
- Console.ReadLine();
- }
- }
- }
運行以上代碼生成的應用程序第一個實例,會得到結果
Running
保持第一個運行狀態,運行第二個實例,得到結果
Another is Running
以上代碼中創建了一個mutex,從其參數的解釋中得知,第一個調用線程將得到互斥體的初始所屬權,如果不釋放的話,其他的線程得不到互斥體所有權
2.Winform程序
Winform程序可以在構造函數中添加以下代碼即可實現,如下
- public Form1()
- {
- InitializeComponent();
- #region 只能運行一個客戶端程序
- bool flag = false;
- System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", out flag);
- //第一個參數:true--給調用線程賦予互斥體的初始所屬權
- //第一個參數:互斥體的名稱
- //第三個參數:返回值,如果調用線程已被授予互斥體的初始所屬權,則返回true
- if (!flag)
- {
- MessageBox.Show("只能運行一個客戶端程序!", "請確定", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- Environment.Exit(1);//退出程序
- }
- #endregion
- }
運行結果,在打開一個實例的情況下,再次運行該程序則彈出對話框