c# 多线程 互斥量

我们在做程序时,有时候希望在一台电脑上面只有一个进程实例在运行,利用Mutex互斥量可以实现了这个功能,方法及步骤如下:

接下来分控制台程序和Winform程序两种情况下实现此功能

1.控制台程序

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading;  
  6.   
  7. namespace myConApp  
  8. {  
  9.     class Test  
  10.     {  
  11.         /// <summary>  
  12.         /// 应用程序的主入口点。  
  13.         /// </summary>  
  14.         [STAThread]  
  15.         static void Main(string[] args)  
  16.         {  
  17.             bool flag = false;  
  18.             System.Threading.Mutex mutex = new System.Threading.Mutex(true"Test"out flag);  
  19.             //第一个参数:true--给调用线程赋予互斥体的初始所属权  
  20.             //第一个参数:互斥体的名称  
  21.             //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true  
  22.             if (flag)  
  23.             {  
  24.                 Console.Write("Running");  
  25.             }  
  26.             else  
  27.             {  
  28.                 Console.Write("Another is Running");  
  29.                 System.Threading.Thread.Sleep(5000);//线程挂起5秒钟  
  30.                 Environment.Exit(1);//退出程序  
  31.             }  
  32.             Console.ReadLine();  
  33.   
  34.         }  
  35.     }  
  36. }  


 运行以上代码生成的应用程序第一个实例,会得到结果

Running
 保持第一个运行状态,运行第二个实例,得到结果

Another is Running
 以上代码中创建了一个mutex,从其参数的解释中得知,第一个调用线程将得到互斥体的初始所属权,如果不释放的话,其他的线程得不到互斥体所有权

2.Winform程序

Winform程序可以在构造函数中添加以下代码即可实现,如下

[csharp]  view plain  copy
  1. public Form1()  
  2. {  
  3.     InitializeComponent();  
  4.     #region 只能运行一个客户端程序  
  5.     bool flag = false;  
  6.     System.Threading.Mutex mutex = new System.Threading.Mutex(true"Test"out flag);  
  7.     //第一个参数:true--给调用线程赋予互斥体的初始所属权  
  8.     //第一个参数:互斥体的名称  
  9.     //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true  
  10.     if (!flag)  
  11.     {  
  12.         MessageBox.Show("只能运行一个客户端程序!""请确定", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
  13.         Environment.Exit(1);//退出程序  
  14.     }  
  15.     #endregion  
  16.   
  17. }  

运行结果,在打开一个实例的情况下,再次运行该程序则弹出对话框

猜你喜欢

转载自blog.csdn.net/sinat_23338865/article/details/80654550
今日推荐