C#使用Mutex实例详解

1.单实例运行

[STAThread] static void Main() {

 bool isAppRunning = false;

 System.Threading.Mutex mutex = new System.Threading.Mutex(true,System.Diagnostics.Process.GetCurrentProcess().ProcessName,out isAppRunning);

 if (!isAppRunning) {

  MessageBox.Show("本程序已经在运行了,请不要重复运行!");

  Environment.Exit(1);

 }

 else

 {

  Application.EnableVisualStyles();

  Application.SetCompatibleTextRenderingDefault(false);

  Application.Run(new Form1());

 }

}

2.

 

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

关于互斥量Mutex的理解及用法可以参考博客http://blog.csdn.net/xwdpepsi/article/details/6346890

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

1.控制台程序

参考别人的博客的代码实验

 
  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. }

  37.  


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

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

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

2.Winform程序

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

 
  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. }

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

 

3.

   System.Threading.Mutex mutex = new System.Threading.Mutex(false, "ThisShouldOnlyRunOnce");//根据ThisShouldOnlyRunOnce名字多进程访问mutex
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值