C#使用Mutex实例详解
1.單實例運行
[STAThread] static void Main() {
?bool isAppRunning = false;
?System.Threading.Mutex mutex = new System.Threading.Mutex(true,System.Diagnostics.Process.GetCurrentProcess().ProcessName,out isAppRunning);
?if (!isAppRunning) {
??MessageBox.Show("本程序已經在運行了,請不要重復運行!");
??Environment.Exit(1);
?}
?else
?{
??Application.EnableVisualStyles();
??Application.SetCompatibleTextRenderingDefault(false);
??Application.Run(new Form1());
?}
}
2.
?
我們在做程序時,有時候希望在一臺電腦上面只有一個進程實例在運行,利用Mutex互斥量可以實現了這個功能,方法及步驟如下:
關于互斥量Mutex的理解及用法可以參考博客http://blog.csdn.net/xwdpepsi/article/details/6346890
接下來分控制臺程序和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
}
運行結果,在打開一個實例的情況下,再次運行該程序則彈出對話框
?
3.
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ThisShouldOnlyRunOnce");//根據ThisShouldOnlyRunOnce名字多進程訪問mutex總結
以上是生活随笔為你收集整理的C#使用Mutex实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK8 集合排序 xxxList.s
- 下一篇: 【Quartz】插件的使用