博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Mutex實現單一程式執行個體的注意事項(转)
阅读量:5952 次
发布时间:2019-06-19

本文共 2627 字,大约阅读时间需要 8 分钟。

相信大家都知道在.NET程式中若要實現單一程式執行個體,一般來說有幾種方法,像是去判斷是否已經有開啟的Process是相同的程式、用Mutex與Semaphore之類的技術來判斷是否程式正在開啟。但是很多網路上的文章都忽略了在用Mutex實現單一程式執行個體時,其實會有些必須要注意的地方,導致於在實際運用上沒有發揮到該有的效果。

 

以一個簡單的例子來看,一般我們在網路上常看到的使用方式大概就像下面的程式碼片段類似,建構Mutex時就會回傳該Mutex是否已經存在,利用該回傳值來決定程式應該繼續開啟還是關閉。

 

using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using System.Threading;namespace WindowsFormsApplication10{    static class Program    {        ///         /// The main entry point for the application.        ///         [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            Boolean bCreatedNew;            //Create a new mutex using specific mutex name            Mutex m = new Mutex(false, "myUniqueName", out bCreatedNew);            if (bCreatedNew)                Application.Run(new Form1());        }    }}

這樣的程式到底有什麼樣的問題呢?有興趣的可以試著建置Release的程式看看,其實這樣的程式在某些情況下會在Release模式下失效,Debug的運作卻是正常的,若試不出來的可以再加上個GC.Collect試試,會更容易重現。

...Boolean bCreatedNew;//Create a new mutex using specific mutex nameMutex m = new Mutex(false, "myUniqueName", out bCreatedNew);GC.Collect();if (bCreatedNew)    Application.Run(new Form1());...

之所以會有這樣的問題,是因為Mutex在Release模式下被GC給回收了,而Debug模式下因為便於開發人員除錯,據說有將GC的周期給拉長,所以不容易重現。那這樣的問題要怎麼樣解決呢?這邊筆者有整理了幾種方法。

 

一個方法就是把Mutex給拉出來成為類別成員。

...static Mutex m;/// /// The main entry point for the application./// [STAThread]static void Main(){    Application.EnableVisualStyles();    Application.SetCompatibleTextRenderingDefault(false);    Boolean bCreatedNew;    //Create a new mutex using specific mutex name    m = new Mutex(false, "myUniqueName", out bCreatedNew);    GC.Collect();    if (bCreatedNew)        Application.Run(new Form1());}...

另一個方法就是讓Mutex不要被GC回收掉,像是在程式最後明確呼叫Dispose,讓GC知道該Mutex仍在使用。

...Boolean bCreatedNew;//Create a new mutex using specific mutex nameMutex m = new Mutex(false, "myUniqueName", out bCreatedNew);GC.Collect();if (bCreatedNew)    Application.Run(new Form1());m.Dispose();...

也可以用using或是try...finally之類的語法將Mutex給hold住。

...Boolean bCreatedNew;//Create a new mutex using specific mutex nameusing (Mutex m = new Mutex(false, "myUniqueName", out bCreatedNew)){    GC.Collect();    if (bCreatedNew)        Application.Run(new Form1());}...

或是把Mutex的用法寫的比較正規一點,加上WaitOne與ReleaseMutex去明確控制Mutex的作用範圍。

...Boolean bCreatedNew;//Create a new mutex using specific mutex nameMutex m = new Mutex(false, "myUniqueName", out bCreatedNew);m.WaitOne();GC.Collect();if (bCreatedNew)    Application.Run(new Form1());m.ReleaseMutex();...

 

转载于:https://www.cnblogs.com/MLGB/p/4465901.html

你可能感兴趣的文章
Freemarker内置函数使用
查看>>
开启微信公众号之旅
查看>>
jstl数字转日期
查看>>
Windows下Hadoop eclipse开发平台搭建
查看>>
Http Live Streaming 实现iphone在线播放视频[转]
查看>>
【温故而知新-Javascript】使用canvas元素(第一部分)
查看>>
【求助】测试XCode v8.0的正向反向功能
查看>>
使用Python代码处理Excel
查看>>
【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)
查看>>
四种方法下载网络文本数据到本地内存
查看>>
pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
查看>>
SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I
查看>>
如何保护你的linux操作系统
查看>>
Linux gcc编译简介、常用命令
查看>>
[] ubuntu 14.04 搜狗拼音输入法安装
查看>>
澳大利推出NB-IOT网络 加速物联网应用
查看>>
codeforces 112APetya and Strings(字符串水题)
查看>>
Xshell 连接CentOS服务器解密
查看>>
必须要掌握的七种谈话技巧
查看>>
GNU make manual 翻译(三十)
查看>>