您的位置:首页 > 其它

通过 Mutex/Semaphore 实现程序进程实例的控制

2010-03-14 11:51 465 查看
实现应用程序的进程单例或者特定数量的控制有多种方式,而通过信号量实现则是最简单有效的办法,在.NET中我们可以通过 Multex、Semaphore 类来实现。

1、Mutex、Semaphore 简介

Mutex 是用于同步的线程或进程的互斥体。Multex 分为两种:未命名的局部互斥体和命名的系统互斥体。前者用于线程间的互斥,后者用于系统进程间的互斥。本文讨论的进程单例的实现将演示使用“命名的系统互斥体”。

Semaphore 是用于同步的线程或进程的信号量。Semaphore 也分为两种:未命名的局部信号量和命名的系统信号量。前者用于线程间的同步,后者用于系统进程间的同步。本文的进程实例数量的控制的实现将演示使用“命名的系统信号量”。

2、进程单例的控制

实现思路:通过在程序启动后创建特定名称的命名的系统互斥体,标识应用程序的进程实例,后来启动的进程实例如果发现已经存在该名称的命名互斥体时,则直接退出进程,这样便保持了进程实例的唯一。
具体的代码如下:
using System;
using System.Windows.Forms;
using System.Threading;

namespace DemoSingltonApplication
{
/// <summary>
/// 通过信号量互斥实现应用程序单例;
/// </summary>
static class Program
{
public const string APP_NAME = "My.SingltonApp.76E078632B58";

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

//通过 Mutex 实现程序单例;
bool isFirstAppInstance;

Mutex mutex = new Mutex(true, APP_NAME, out isFirstAppInstance);
if (isFirstAppInstance)
{
Application.Run(new FrmMain());
}
else
{
MessageBox.Show("系统中已经运行了程序的其它实例!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
}
}


3、进程实例数量的控制

实现思路:在应用程序启动后创建特定名称的具有指定最大资源数的命名的系统信号量,并请求进入该信号量,如果无法进入该信号量,则表明系统中进程的实例已经达到最大数,此时退出,以此控制应用程序的进程实例不超过特定的数量。
具体代码如下:
using System;
using System.Windows.Forms;
using System.Threading;

namespace DemoSingltonApplication
{
/// <summary>
/// 通过信号量互斥实现应用程序单例;
/// </summary>
static class Program
{
public const string APP_NAME = "My.SingltonApp.76E078632B58";
public const int APP_INSTANCE_MAXCOUNT = 2;

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

//通过 Semaphore 实现控制的程序的指定数量实例;
Semaphore sem = new Semaphore(APP_INSTANCE_MAXCOUNT, APP_INSTANCE_MAXCOUNT, APP_NAME);
bool isOverflow = !sem.WaitOne(0);
if (isOverflow)
{
MessageBox.Show("系统中运行的程序实例数已经超出允许的最大数量(" + APP_INSTANCE_MAXCOUNT + ")!", "注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
Application.Run(new FrmMain());
sem.Release();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: