C#中Mutex的用法
2016-11-23 13:33
155 查看
C#中Mutex是互斥锁,位于System.Threading 命名空间中。
顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。
如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。
线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。
我们可以利用这个特性来控制一个应用程序只能运行一个实例。其他实例由于得不到这个Mutex而不能运行。
代码如下所示
这里先运行一个实例,然后再运行第二个,通过日志可以查看启动过程,如下所示
从日志可以看出,当第二个实例想运行的时候,由于已经有一个进程拥有了这个互斥锁,此进程不能拥有,所以进程启动被终止。
此外还需说明一点,mutex的name是在系统中是唯一的,也就是上述代码中的Name,系统依靠这个name属性来标识唯一的Mutex。
顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。
如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。
线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。
我们可以利用这个特性来控制一个应用程序只能运行一个实例。其他实例由于得不到这个Mutex而不能运行。
代码如下所示
//程序启动时判断进程是否可以启动 private App() { if (!CanCreate()) { logger.Warn("Can't run the Environment now, because one Instance is already running!"); Environment.Exit(-1); } } //进程是否可以创建 private static bool CanCreate() { bool canCreate; mutex = new Mutex(true, Name, out canCreate); return canCreate; }
这里先运行一个实例,然后再运行第二个,通过日志可以查看启动过程,如下所示
2016-11-23 13:47:03 -[ Info]- App Info: PDT_Test_Environment v1.0.0 2016-11-23 13:47:03 -[ Info]- Application startup... 2016-11-23 13:47:05 -[ Warn]- Can't run the Environment now, because one Instance is already running! 2016-11-23 13:47:08 -[ Info]- Mutex PDT_Test_Environment was released. Application exit...
从日志可以看出,当第二个实例想运行的时候,由于已经有一个进程拥有了这个互斥锁,此进程不能拥有,所以进程启动被终止。
此外还需说明一点,mutex的name是在系统中是唯一的,也就是上述代码中的Name,系统依靠这个name属性来标识唯一的Mutex。
相关文章推荐
- C#中Mutex的用法
- C#中Mutex对象用法分析
- C# MediaPlayer的详细用法
- C#中Split用法~
- C#中foreach基本用法
- C#中out , ref 和params的用法
- C# this.Invoke()的作用与用法
- 文件流Filestream 的用法(C#中的StreamReader/StreamWriter)相关网址
- C#学习笔记:CheckedListBox控件的用法
- C#基本概念之Mutex---互斥锁
- 【C#】GridView用法
- C#中using指令的几种用法
- C#中DllImport用法汇总
- C# Task用法
- C#中委托用法实例分析
- c#几种访问修饰符的用法
- <C#>FTP的用法
- C#中的委托用法
- C# List<T>用法
- [C#] ??雙問號的意思及用法