C#在终端服务器只允许运行应用程序的一个实例

时间:2022-08-29 14:11:29
只允许运行应用程序的一个实例,用 Mutex互斥体可以实现,但是一定要明确程序运行场景。


常见代码如下:

static void Main()
        {
            try
            {
                bool createNew;
                using (Mutex m = new Mutex(true, Application.ProductName, out createNew))
                {
                    if (createNew)
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                        Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);
                        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                        Application.Run(new DatabaseSync());
                    }
                    //else    //根据自己的需要书写提示信息
                    //{
                    //    MessageBox.Show("Only one instance of this application is allowed!");
                    //}
                }
            }
            catch
            {
                //MessageBox.Show("Only one instance of this application is allowed!");
            }
        }


以上的写法在单用户下运行没有问题;在多用户下,每个用户都能启动一个实例,也就不能保证单实例运行了。
如果需要在终端机服务器上使用,并且只允许一个实例的话,请使用下面的写法:

static void Main()
        {
            try
            {
                bool createNew;
                using (Mutex m = new Mutex(true, "Global\\" + Application.ProductName, out createNew))
                {
                    if (createNew)
                    {
                        Application.EnableVisualStyles();
                        Application.SetCompatibleTextRenderingDefault(false);
                        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                        Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);
                        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                        Application.Run(new DatabaseSync());
                    }
                    //else
                    //{
                    //    MessageBox.Show("Only one instance of this application is allowed!");
                    //}
                }
            }
            catch
            {
                //MessageBox.Show("Only one instance of this application is allowed!");
            }
        }


以下是MSDN的说明:
在运行终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见。在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名称“Global\”和“Local\”说明 mutex 名称相对于终端服务器会话(而并非相对于进程)的范围。


转载出处http://www.2cto.com/kf/201205/133460.html