• 利用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( "你已启动了一个" ) ; }
  • 相关阅读:
    C#文件读写常用类介绍
    C#实现注销、重启和关机代码
    Mybatis学习---基础知识考核
    Linux操作系统各版本ISO镜像下载
    Java学习---JDK的安装和配置
    Java学习---基础知识学习
    Java学习---常见的模式
    Java实例---黑白五子棋[单机版]
    Java实例---简单的超市管理系统
    Java实例---简单的个人管理系统
  • 原文地址:https://www.cnblogs.com/dennysong/p/5582610.html
Copyright © 2020-2023  润新知