通过 Mutex/Semaphore 实现程序进程实例的控制
2010-03-14 11:51
465 查看
实现应用程序的进程单例或者特定数量的控制有多种方式,而通过信号量实现则是最简单有效的办法,在.NET中我们可以通过 Multex、Semaphore 类来实现。
1、Mutex、Semaphore 简介
Mutex 是用于同步的线程或进程的互斥体。Multex 分为两种:未命名的局部互斥体和命名的系统互斥体。前者用于线程间的互斥,后者用于系统进程间的互斥。本文讨论的进程单例的实现将演示使用“命名的系统互斥体”。
Semaphore 是用于同步的线程或进程的信号量。Semaphore 也分为两种:未命名的局部信号量和命名的系统信号量。前者用于线程间的同步,后者用于系统进程间的同步。本文的进程实例数量的控制的实现将演示使用“命名的系统信号量”。
2、进程单例的控制
实现思路:通过在程序启动后创建特定名称的命名的系统互斥体,标识应用程序的进程实例,后来启动的进程实例如果发现已经存在该名称的命名互斥体时,则直接退出进程,这样便保持了进程实例的唯一。
具体的代码如下:
3、进程实例数量的控制
实现思路:在应用程序启动后创建特定名称的具有指定最大资源数的命名的系统信号量,并请求进入该信号量,如果无法进入该信号量,则表明系统中进程的实例已经达到最大数,此时退出,以此控制应用程序的进程实例不超过特定的数量。
具体代码如下:
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(); } } } }
相关文章推荐
- C#利用Mutex实现只运行一个程序实例
- 详解微信小程序 通过控制CSS实现view隐藏与显示
- (4.1.18.6)Android应用中通过AIDL机制实现进程间的通讯实例
- 使用Mutex实现程序单实例运行(c#)
- Zookeeper实践之:通过Zookeeper实现一个消费者进程分配程序
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- 利用互斥体(MUTEX)实现程序只允许运行一个实例
- 在VC++实现控制程序只运行唯一一个实例
- 进程间同步(Process Synchronization)-2 通过semaphore方式来实现进程间同步的例子
- Android之通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例
- 一周乱弹(1,摸态框增加纵向滚动条2,jQuery 鼠标点击事件3,通过ajax实现批量导出。4,windows查询占用某个端口号程序并杀死其进程)
- Android应用中通过AIDL机制实现进程间的通讯实例
- jstl if和foreach的混合使用 实现通过后台值控制select默认选项的功能【实例】
- 微信小程序 通过控制CSS实现view隐藏与显示
- Android应用中通过AIDL机制实现进程间的通讯实例
- Android应用中通过AIDL机制实现进程间的通讯实例