Mutex可以实现跨进程的同步,当需要控制应用程序只有一个进程实例时,可通过判断相同名字的Mutex资源是否已存在来判断程序是否已经启动。
示例如下:
1 static void Main() 2 { 3 bool createdNew=false; 4 Mutex mutex=new Mutex(true,"consoleapplication1",out createdNew); 5 if (!createdNew) 6 { 7 Console.WriteLine("Application has been started!"); 8 Console.Read(); 9 return; 10 } 11 else 12 { 13 //Code to start the application 14 }
项目启动时,名为“consoleapplication1”的mutex资源即被创建,结束后即被释放,再有项目实例需启动时,可通过判断该资源是否存在来判断程序是否已经启动
在官方文档的介绍中,有这样一段话
在运行终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名称“Global\”和“Local\”说明 mutex 名称相对于终端服务器会话(而并非相对于进程)的范围。
很可惜没有找到C#示例,这段话可以理解为:
mutexName= "Local\\" +"AppName";
只对创建它的会话有效,也就是说新开启一个远程链接时会再次启动 ConsoleApp实例。
mutexName= "Global\\" +"AppName";
对所有会话有效,开启多个远程链接时,只有第一个远程链接会成功启动 ConsoleApp实例。