同一时刻,只能有一个线程持有该锁!
使用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代码块包裹互斥量对象。
原文地址:https://www.cnblogs.com/gougou1981/p/12337091.html
时间: 2024-10-09 07:44:21