利用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。

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( "你已启动了一个" ) ; }
原文地址:https://www.cnblogs.com/dennysong/p/5582610.html