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編譯是沒有任何問題的,但是問題總是困擾我。
我在优快云上討論後,有了這樣的答案。
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那本書吧。。。