您的位置:首页 > 编程语言 > C#

C#利用Mutex互斥量实现同时只有一个进程实例在运行

2011-07-18 14:49 821 查看
我们在做程序时,有时候希望在一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能,方法及步骤如下:
关于互斥量Mutex的理解及用法可以参考博客/article/8253936.html
接下来分控制台程序和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

}
运行结果,在打开一个实例的情况下,再次运行该程序则弹出对话框



刚才看别人的博客上面做有总结,如果大家想深入了解到话,可参考博客
/article/5947434.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐