Mutex實現單實例,你真的搞懂了嗎?來看看吧
来源:互联网 发布:视频效果软件 编辑:程序博客网 时间:2024/06/04 20:14
http://www.cnblogs.com/keyrratuff/archive/2009/03/17/1414249.html
通常需要winform只運行一個實例的話,我們用這樣一個方法
修改Program.cs
using System;using System.Collections.Generic;using System.Windows.Forms;using System.Threading;namespace StudentGUI{ static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { bool IsRunning; Mutex mutex = new Mutex(true, "StudentGUI", out IsRunning); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (IsRunning) { Application.Run(new Form1()); } } }}
然而,同樣的代碼在我的一個工程裡做debug編譯和release編譯的結果就是不同。
debug無論如何都是能正確的在第二個實例不執行Application.Run(new Form1()); 也就是IsRunning是false
release版本如果你回去做個空的winform寫上這樣的代碼保證你可以實現單實例效果, 但是!!我的工程裡面release的IsRunning總是true
也就是沒有效果了。。。
我花了很多時間去精簡我的工程,到最後,我的工程只有了幾個空的panel和一個form1的背景,仍然在release沒有效果。
這時候,我任意刪掉一個panel,甚至換一個form1的backgroundimage都會正常起來。
我疑惑的是什麼情況下會使的這個IsRunning在release編譯下總為Ture。
當然我給客戶一個debug編譯是沒有任何問題的,但是問題總是困擾我。
我在CSDN上討論後,有了這樣的答案。
Debug版延長了mutex的生命(以便被調試),而Release版則任由mutex被垃圾回收。
如果前一個實例中的mutex被回收了,後一個實例當然偵測不到已經釋放的mutex了。
解決方法,把mutex寫為靜態成員:
static class Program{ static Mutex mutex; //<---- [STAThread] static void Main() { bool IsRunning; mutex = new Mutex(true, "StudentGUI", out IsRunning); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!IsRunning) { Application.Run(new Form1()); } }}
或在程序末尾再次使用它,避免被垃圾回收:
static void Main() { bool IsRunning; Mutex mutex = new Mutex(true, "StudentGUI", out IsRunning); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!IsRunning) { Application.Run(new Form1()); } (mutex as IDisposable).Dispose(); //<--- }
當然,還可以這樣阻止被回收:
[STAThread] static void Main() { bool IsRunning; Mutex mutex = new Mutex(true, "StudentGUI", out IsRunning); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (IsRunning) { Application.Run(new Form1()); GC.SuppressFinalize(mutex); } }
這個問題其實挺難,我和一個朋友甚至去看Mutex的源代碼;
這個問題其實也挺容易,release和debug的區別並不多,所以問題應該很容易找到;
因為涉及多線程,還考慮過多線程的問題,應該說是Framework學的不夠好,再去啃啃CLR Via那本書吧。。。
- Mutex實現單實例,你真的搞懂了嗎?來看看吧
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- 你真的已经搞懂JavaScript了吗?
- KMP算法真的搞死人,终于搞懂了
- KMP算法真的搞死人,终于搞懂了
- 你真的搞懂了什么叫敏捷式 ( Agile ) 开发吗?
- js小题目测试你是否真的搞懂JavaScript了
- js小题目测试你是否真的搞懂JavaScript了
- 你真的搞懂Javascript了吗?(5道测试题)
- 你真的搞懂什么是线框图,什么是原型图了吗?
- 真的搞不懂了
- 关于java的++和--操作符,你真的搞明白了吗?
- 我的linux复习之二几个简单的命令
- SQL基础——视图
- Cactus借助Jetty测试Servlet
- 【零起点学通C++】构造函数与默认构造函数的代码及析构函数的相关笔记
- HDOJ--2602--Bone Collector【背包问题】
- Mutex實現單實例,你真的搞懂了嗎?來看看吧
- 算法导论 4.1-2
- hdu2196树形dp
- 说说大型高并发高负载网站的系统架构(更新)
- android 显示特殊符号
- HOWTO: Unpack, Edit, and Re-Pack Boot Images
- 设置简单的类似水纹效果
- Java图像分割-思路和源代码
- linux远程遥控linux --- Ubuntu10.04/Ubuntu12.04