利用Mutext實現單實例程序

    /// <summary>
    /// 使用可指示調用線程是否應具備互斥體的初始全部權以及字符串是否爲互斥體的名稱的 Boolean 值和當線程返回時可指示調用線程是否已賦予互斥體的初始全部權的 Boolean 值初始化 <see cref="T:System.Threading.Mutex"/> 類的新實例。
    /// </summary>
    /// <param name="initiallyOwned">若是爲 true,則給予調用線程已命名的系統互斥體的初始所屬權(若是已命名的系統互斥體是經過此調用建立的);不然爲 false。</param>
    ///<param name="name"><see cref="T:System.Threading.Mutex"/> 的名稱。若是值爲 null,則 <see cref="T:System.Threading.Mutex"/> 是未命名的。</param>
    ///<param name="createdNew">在此方法返回時,若是建立了局部互斥體(即,若是 <paramref name="name"/> 爲 null 或空字符串)或指定的命名系統互斥體,則包含布爾值 true;若是指定的命名系統互斥體已存在,則爲 false。此參數未經初始化即被傳遞。</param>
    ///<exception cref="T:System.UnauthorizedAccessException">命名的互斥體存在並具備訪問控制安全性,但用戶不具備 <see cref="F:System.Security.AccessControl.MutexRights.FullControl"/></exception>
    ///<exception cref="T:System.IO.IOException">發生了一個 Win32 錯誤。</exception>
    ///<exception cref="T:System.Threading.WaitHandleCannotBeOpenedException">沒法建立命名的互斥體,緣由多是與其餘類型的等待句柄同名。</exception>
    ///<exception cref="T:System.ArgumentException"><paramref name="name"/> 長度超過 260 個字符。</exception>
    [SecurityCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    [__DynamicallyInvokable]
    public Mutex(bool initiallyOwned, string name, out bool createdNew)
      : this(initiallyOwned, name, out createdNew, (MutexSecurity) null)
    {
    }

//
// 摘要:
// 使用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值、一個做爲互斥體名稱的字符串,以及一個在方法返回時指示調用線程是否被授予互斥體的初始所屬權的布爾值來初始化
// System.Threading.Mutex 類的新實例。
//
// 參數:
// initiallyOwned:
// 若是爲 true,則給予調用線程已命名的系統互斥體的初始所屬權(若是已命名的系統互斥體是經過此調用建立的);不然爲 false。
//
// name:
// System.Threading.Mutex 的名稱。若是值爲 null,則 System.Threading.Mutex 是未命名的。
//
// createdNew:
// 在此方法返回時,若是建立了局部互斥體(即,若是 name 爲 null 或空字符串)或指定的命名系統互斥體,則包含布爾值 true;若是指定的命名系統互斥體已存在,則爲
// false。該參數未經初始化即被傳遞。
//
// 異常:
// T:System.UnauthorizedAccessException:
// 命名的互斥體存在並具備訪問控制安全性,但用戶不具備 System.Security.AccessControl.MutexRights.FullControl。
//
// T:System.IO.IOException:
// 發生了一個 Win32 錯誤。
//
// T:System.Threading.WaitHandleCannotBeOpenedException:
// 沒法建立命名的互斥體,緣由多是與其餘類型的等待句柄同名。
//
// T:System.ArgumentException:
// name 的長度超過 260 個字符。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
[SecurityCritical]
public Mutex(bool initiallyOwned, string name, out bool createdNew);安全

out返回值,能建立互斥體,則返回true,不能建立互斥體Mutex,則說明已經存在運行的實例,返回false。this

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());
}
或者
//Mutex互斥類主要特色就是進程間共享,進程間互相排斥,搶鎖,用名稱作標識。 bool createdNew ; Mutex mutex = new Mutex( false , "aaaa" , out createdNew) ; if( mutex.WaitOne(1000,false ) ) { try { Console.WriteLine( "正常啓動。" ) ; } finally { mutex.ReleaseMutex() ; } } else { Console.WriteLine( "你已啓動了一個" ) ; }
相關文章
相關標籤/搜索