博文《C#中只启动一个程序实例》中源代码(修订改进版)



在C#编程中,有时我们需要确保我们的应用程序在任何时刻都只有一个实例在运行。这通常用于防止用户意外地打开多个程序窗口,或者为了保持程序状态的一致性。标题提到的"只启动一个程序实例",是通过实现单例模式来达到这个效果。下面,我们将深入探讨C#中如何实现这一功能,以及为什么需要这样做。 我们需要了解单例模式的基本概念。单例模式是一种设计模式,它限制类的实例化过程,确保在整个应用中,一个类只有一个实例,并提供一个全局访问点。在C#中,我们可以通过多种方式来实现单例,但最常见的方法是使用`static`和`lock`关键字。 在描述中提到了“由于不能删除资源,所以只能这么加后缀”,这可能指的是在创建单例时为了避免资源冲突或文件锁定问题。在实现单例时,我们通常会用到一个静态的实例变量和一个同步锁对象,例如: ```csharp public class SingleInstanceApp { private static readonly object syncLock = new object(); private static SingleInstanceApp instance; private SingleInstanceApp() {} public static SingleInstanceApp Instance { get { lock (syncLock) { if (instance == null) { instance = new SingleInstanceApp(); } return instance; } } } } ``` 这段代码中,`syncLock`是一个静态对象,用于同步对`Instance`属性的访问,确保在多线程环境中安全创建单例。如果`instance`为`null`,则创建新的`SingleInstanceApp`实例。这种实现方式被称为"双检锁/双重检查锁定"(Double-Checked Locking)模式,它兼顾了性能和线程安全性。 然而,仅仅实现单例还不足以确保程序只有一个实例在运行。为了阻止用户启动第二个实例,我们需要监听操作系统级别的事件,例如Windows的消息队列。我们可以使用`Mutex`或`NamedPipe`来实现这一点: ```csharp using System.Threading; public class SingleInstanceApp { private static Mutex mutex = new Mutex(true, "UniqueMutexName"); public static void Main() { if (!mutex.WaitOne(0, false)) { // 另一个实例已经在运行,退出当前实例 MessageBox.Show("程序已正在运行,无法启动另一个实例。"); return; } // 应用程序的主要逻辑 // ... // 在程序结束时释放互斥量 mutex.ReleaseMutex(); } } ``` 在这个例子中,我们创建了一个全局的`Mutex`,并尝试获取它的所有权。如果获取失败,说明已有另一个实例持有该`Mutex`,因此我们不再继续执行程序。`Mutex`在程序关闭时会被自动释放,但这里我们手动释放以确保良好的资源管理。 文件名为`TestOneInstanceOnly`,可能是用来测试这个单例实现的。它可能包含一个简单的控制台应用程序,用于启动和测试单例程序是否能正确阻止额外的实例。 C#中实现只启动一个程序实例的关键在于结合单例模式和系统级的同步机制,如`Mutex`,以确保程序的唯一性和资源的正确管理。通过这样的设计,我们可以避免程序状态的混乱,提高用户体验。












































































- 1

- x_ls2014-05-04不错,能运行,实现了只启动一个程序实例。。。
- dotinfo2015-08-15确实不错,源代码可运行,且结果正确!

- 粉丝: 28
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 三菱Q系列PLC在大型自动化生产线的应用:伺服控制、通讯与测量 - 伺服控制 (08月24日)
- Matlab与Yalmip编程实现电动汽车集群优化:多需求偏好下综合用电成本最小化
- 基于开源软件构建企业网络安全防护体系-企业安全建设入门指南-开源安全工具实践手册-威胁情报与态势感知系统-业务风控与代码审计技术-服务器加固与资产管理方案-用于帮助企业安全负责人和.zip
- 【绳索牵引并联机器人】基于弹性动力学模型的力/位混合控制与参数辨识研究:高精度控制及应用实现(含详细代码及解释)
- 【复合材料动力学】石墨烯树脂复合材料板1:3内共振非线性动力学分析:理论建模与数值仿真(含详细代码及解释)
- 电动汽车集群优化:基于MATLAB和YALMIP的综合用电成本最小化方案设计 教程
- 探讨了中国半干旱地区降水对陆地生态系统碳通量的时间累积和滞后效应(含详细代码及解释)
- Abaqus岩土工程中隧道空洞对地表影响的CAE模型与inp文件分析及应用 · CAE模型 权威版
- 自动驾驶基于时空风险场的道路车辆预测轨迹规划:实现与优化技术详解(含详细代码及解释)
- 土木工程基于实测车流的在役混凝土梁桥承载性能演化分析:失效概率与抗力退化模型构建及应用(含详细代码及解释)
- COMSOL二维空气介质阻挡放电模型:氩气与氦气等离子体反应的深入解析
- 基于DSP28335平台的无感FOC矢量控制算法——集成磁链观测器、PLL与增量编码器接口的全局可调优化方案及仿真模型
- 通过预处理将特定格式Excel配置表转换为二进制数据和数据模型代码的编译工具项目-支持多语言运行时快速加载读取UnityCSharp数据表配置编译生成工具-用于游戏开发配置表高效序.zip
- 基于Boost加NPC拓扑结构的光伏逆变器低电压穿越仿真模型研究:中点平衡SVPWM控制与正负序分离控制的应用
- 【能源化工领域】基于风电波动性的电制氢合成甲醇系统柔性优化调度:技术实现与经济效益分析(含详细代码及解释)
- 电力电子领域ANPC三电平逆变器MATLABSimulink仿真模型与SVPWM控制算法研究 调制方法


