12

好的,所以我已经创建了我的 c# 应用程序,为它创建了一个安装程序,并将它安装在我的机器上。

问题是,当用户打开应用程序 exe 两次时,将会有两个应用程序实例在运行。我只希望应用程序的一个实例随时运行,我该怎么做呢?

谢谢你的帮助,

4

4 回答 4

9

常见的技术是创建一个命名Mutex并在应用程序启动时检查它的存在。

这个这个

来自 DDJ 的代码:

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}
于 2009-07-30T14:50:47.603 回答
8

我通过这个解决了这个问题

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

这很简单,但我几乎没有时间检查更好的解决方案。

于 2009-07-30T15:32:09.847 回答
4

感谢艾伦鲍威尔先生

static void Main() 
{
    using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
        if (!mutex.WaitOne(0, false)) {
            string processName = GetProcessName();
            BringOldInstanceToFront(processName);
        }
        else {
            GC.Collect();
            Application.Run(new Voting());
        }
    }
}

private static void BringOldInstanceToFront(string processName) {
    Process[] RunningProcesses = Process.GetProcessesByName(processName);
    if (RunningProcesses.Length > 0) {
        Process runningProcess = RunningProcesses[0];
        if (runningProcess != null) {
            IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
        NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
        }
    }
}
于 2009-07-30T15:26:46.080 回答
0

我不知道您正在运行的环境,但是关于“单实例应用程序”要记住的一点是您如何定义单实例。如果应用程序可以同时在多个工作站上运行,使用一个公共数据源,这是一个问题吗?同样,如果有多个用户登录到同一台计算机的终端服务情况(或“运行方式”情况),您是否希望以这样一种方式限制应用程序,即每个用户只有一个实例,每个-电脑?或者您可以接受它只是每个用户一个实例吗?

这些问题的答案可能会引导你走向一个方向而不是另一个方向。例如,我们有一个“单实例”应用程序,其范围是一组计算机。该组工作站中只允许一个用户使用。我们通过在我们的共享数据源中有一个表来跟踪当前连接的用户来管理这一点。这是一个维护问题,因为您需要确保该表始终 100% 准确。处理工作站上的意外断电等事情,在该表中留下“虚假”记录需要一些小心处理。

于 2009-07-30T15:02:59.223 回答