zoukankan      html  css  js  c++  java
  • 利用Mutex实现应用程序的单实例运行

    System.Threading.Mutex :同步基元,它只向一个线程授予对共享资源的独占访问权。[MSDN]
    实现原理: 在程序启动时,请求一个互斥体,如果能获取对指定互斥的访问权,就继续运行程序,否则就退出程序。
    测试代码:

    class Test

         {

             /// <summary>

             /// 应用程序的主入口点。

             /// </summary>

              [STAThread]

             static void Main(string[] args)

             {

                  bool flag=false;

                  System.Threading.Mutex mutex=new System.Threading.Mutex(true,"Test",out flag);

                  //第一个参数:true--给调用线程赋予互斥体的初始所属权

                  //第一个参数:互斥体的名称

                  //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true

                  if(flag)

                  {

                       Console.Write("Running");

                  }

                  else

                  {

                       Console.Write("Another is Running");

                       System.Threading.Thread.Sleep(5000);//线程挂起5秒钟

                       Environment.Exit(1);//退出程序

                  }

                  Console.ReadLine();

             }


    运行结果:
    第一次运行,输出"Running"。
    不关闭第一次运行的程序, 进行第二次运行,输出"Another is Running",五秒钟后,程序自动退出。
      我项目中的实例:
             /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main(string[] args)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                
                /*--------------------判断程序是否已经启动--------------------------*/
                Mutex mutex = new Mutex(false, "ShangGuSys");
                bool running = !mutex.WaitOne(0, false);
                if (running)
                {
                    MessageBox.Show("应用程序已经启动!", "环太ERP!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                /*--------------------End----------------------------------------*/
                
                //if (!LoginServer())//登录连接服务器,解决部分计算机访问服务器要输入用户名和密码的问题
                //    MessageBox.Show("连接服务器失败,软件可能无法正常使用", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
                if (LiveUpdate.VerifyLiveUpdateFile() == 1)//如果本地为旧文件则启动升级
                {
                    System.Diagnostics.Process.Start("ShangGu.Update.exe");
                    Application.Exit();
                    return;
                }
               
                Frm_Login fl = new Frm_Login();
                fl.Activate();
                fl.ShowDialog();
                if (fl.LoginSuccess)//用户名和密码验证成功
                {
                    Splash.Show();
                    DoStartup(args);
                }
            }
  • 相关阅读:
    USACO 3.3 A Game
    USACO 3.3 Camelot
    USACO 3.3 Shopping Offers
    USACO 3.3 TEXT Eulerian Tour中的Cows on Parade一点理解
    USACO 3.3 Riding the Fences
    USACO 3.2 Magic Squares
    USACO 3.2 Stringsobits
    USACO 3.2 Factorials
    USACO 3.2 Contact
    USACO 3.1 Humble Numbers
  • 原文地址:https://www.cnblogs.com/ziyan22/p/1088404.html
Copyright © 2011-2022 走看看