避免运行多个实例

本文关键字:实例 运行 | 更新日期: 2023-09-27 18:09:41

我试图设置一个互斥,以便只允许在一个实例中运行我的应用程序。我写了下一个代码(就像在其他帖子中建议的那样)

 public partial class App : Application
    {
        private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
        protected override void OnStartup(StartupEventArgs e)
        {
            using (Mutex mutex = new Mutex(false, "Global''" + appGuid))
            {
                if (!mutex.WaitOne(0, false))
                {
                    MessageBox.Show("Instance already running");
                    return;
                }
                base.OnStartup(e);
               //run application code
            }
        }
    }

很遗憾,这个代码不能工作。我可以在多个实例中启动应用程序。有人知道我的代码有什么问题吗?由于

避免运行多个实例

在运行应用程序的第一个实例之后就释放互斥锁。将其存储在字段中,不要使用using块:

public partial class App : Application
{
    private Mutex _mutex;
    private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
    protected override void OnStartup(StartupEventArgs e)
    {
        bool createdNew;
        // thread should own mutex, so pass true
        _mutex = new Mutex(true, "Global''" + appGuid, out createdNew);
        if (!createdNew)
        {
            _mutex = null;
            MessageBox.Show("Instance already running");
            Application.Current.Shutdown(); // close application!
            return;
        }
        base.OnStartup(e);
        //run application code
    }
    protected override void OnExit(ExitEventArgs e)
    {          
        if(_mutex != null)
            _mutex.ReleaseMutex();
        base.OnExit(e);
    }
}

如果互斥锁已经存在,输出参数createdNew返回false

你可以检查你的进程是否已经在运行:

Process[] pname = Process.GetProcessesByName("YourProccessName");
if (pname.Length == 0)
    Application.Exit();