C#程序如何设置只能开一个,不能多开(链接)
使用c# mutex,可以做到跨进程同步,实现应用程序只能单开,不能多开,参考:
单开.NET Core控制台项目,示例代码:
using System; using System.Threading; namespace NetCoreMutex { class Program { private static Mutex mutex = null; //设为Static成员,是为了在整个程序生命周期内持有Mutex static void Main() { bool firstInstance; mutex = new Mutex(true, @"Global\MutexSampleApp", out firstInstance); try { if (!firstInstance) { Console.WriteLine("已有实例运行,输入回车退出……"); Console.ReadLine(); return; } else { Console.WriteLine("我们是第一个实例!"); for (int i = 60; i > 0; --i) { Console.WriteLine(i); Thread.Sleep(1000); } } } finally { //只有第一个实例获得控制权,因此只有在这种情况下才需要ReleaseMutex,否则会引发异常。 if (firstInstance) { mutex.ReleaseMutex(); } mutex.Close(); mutex = null; } } } }
使用Mutex需要注意的两个细节:
- 可能你已经注意到了,例子中在给Mutex命名的字符串里给出了一个“Global\”的前缀。这是因为在运行终端服务(或者远程桌面)的服务器上,已命名的全局 mutex 有两种可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见,在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名称“Global\”和“Local\”仅用来说明 mutex 名称相对于终端服务器会话(而并非相对于进程)的范围。最后需要注意“Global\”和“Local\”是大小写敏感的。
- 既然父类实现了IDisposalble接口,那么说明这个类一定需要你手工释放那些非托管的资源。所以必须使用try/finally,亦或我讨厌的using,调用Close()方法来释放Mutex所占用的所有资源!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2018-12-25 EF(EF Core)中的NotMappedAttribute(转载)
2018-12-25 关于C#中async/await中的异常处理(下)-(转载)
2018-12-25 关于C#中async/await中的异常处理(上)-(转载)
2018-12-25 ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常