![](https://img2018.cnblogs.com/i-beta/68725/202002/68725-20200225093145658-1470169388.png)
同一时刻,只能有一个线程持有该锁!
使用Mutex互斥锁来同步两个单独的程序(可以两次运行该程序,查看运行结果)
static void Main(string[] args)
{
const string MutexName = "CSharpThreadingCookbook";
using (var m = new Mutex(false, MutexName))
{
//WaitOne构造表示指定的时间内(这里是5秒)是否可以获得互斥锁定
if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
{
//如果当前实例5秒内不能获取到互斥锁(由于其他线程占用锁【第一次运行的程序未回车】,则此不能获取到互斥锁定,所以代码运行这里)
Console.WriteLine("Second instance is running!");
Console.Read();
}
else//获取到互斥锁
{
////如果当前实例5稍内收到了信号(如果5秒内获得了互斥锁定)【**********第一次运行可以直接进入到这里********】
Console.WriteLine("Running!");//在这里执行同步代码
Console.ReadLine();//等待输入,或者回车(如果不回车,持续占用互斥锁)
m.ReleaseMutex();
}
}
}
使用Mutex互斥锁禁止程序启动两次
[STAThread]
static void Main()
{
bool createNew;
using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createNew))
{
if (createNew)//如果指定的命名系统互斥体不存在(说明没有程序运行过)
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("应用程序已经在运行中...");
System.Threading.Thread.Sleep(1000);
System.Environment.Exit(1);
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
具名的互斥量 是全局的操作系统对象! 请务必正确关闭互斥量。最好使用using代码块包裹互斥量对象。