2

我知道如何确保一次只运行一个应用程序实例: 如何检查应用程序的另一个实例是否正在运行

但是......我怎样才能确保当第二个实例启动时,第一个实例将被关闭(而不是仅仅退出通常完成的第二个实例)。最好等待它完全关闭。

如果同时启动了 2 个以上的实例,那么应该只允许最后一个实例“存活”。

我明白了(谢谢你所有的答案)。我的解决方案如下:

        #region Kill other running processes of this application
        List<Process> processes = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).ToList();
        if (processes.Count > 1)
        {
            processes.Sort((x, y) => DateTime.Compare(x.StartTime, y.StartTime));
            for (int i = 0; i < processes.Count - 1; i++)
            {
                processes[i].CloseMainWindow();
                processes[i].WaitForExit();
            }
        }
        #endregion

        Console.WriteLine(string.Format("{0}:{1}", DateTime.Now.Minute, DateTime.Now.Second));
        Console.ReadLine();
4

3 回答 3

2

您可以使用Microsoft.VisualBasic.dll 的WindowsFormsApplicationBase类。

当创建另一个实例时,在第一个应用程序中引发StartupNextInstance事件。在这种情况下,您可以终止当前进程。

 Process.GetCurrentProcess().Kill();

这将确保新实例处于活动状态,并且先前的实例已关闭。

于 2012-11-12T16:29:39.913 回答
1

可能有更好的方法来做到这一点,涉及进程和事件之间的其他相互通信,但这是一种不需要研究的基本方法(至少在我看来)

当一个进程启动时,创建一个文件(可能带有时间戳)来表示它是否已启动。

让原始进程定期检查文件,并在看到更新的时间戳时停止它

于 2012-11-12T16:24:49.963 回答
1

我认为您自己对逻辑有点困惑。顺便说一下,这里有一些你应该用来做这样的事情的项目:

1- System.Diagnostics.Process.WaitForExit

"Kill"通过为特定的流程实例调用此方法,您可以在调用or"Shutdown"方法后等到流程完全退出。如果它是 Windows 应用程序,它将关闭进程中的主窗口。对于有一些退出确认框的应用程序,它将等到用户确认或取消对话框(例如当您的窗口关闭而您的应用程序已经打开时)。

2- System.Diagnostics.Process.ExitCode

如果要访问发送给进程的存在消息的结果,则应在调用函数"WaitForExit"调用此属性的值。我想您可以使用此属性来确定第一个进程是否退出以及第二个进程的退出原因。

3-公共静态int Main

因为您需要从进程外部访问退出代码,您应该将"Main"方法的返回值更改为int。这样,您可以在第一个进程中返回一个值,并在第二个进程中通过"ExitCode"属性访问它。如果"Main"在您的情况下很难在函数中返回值,您可以通过调用第 4 项来传递退出代码。

4- System.Windows.Application.Shutdown(在 .NET < 4 中退出)

调用此方法与返回函数中的值完全相同"Main"

5- System.Diagnostics.Process.GetProcessesByName

毕竟通过调用这个静态方法,您可以通过指定名称获取所有进程。

希望能帮助到你。我只是试图尽可能简单地解释一切。这些都是您可以用来实现逻辑的工具。如果您知道 .NET 为您提供的这些功能,剩下的事情就会变得如此简单。

毕竟,正如我已经忘记说的那样,如果你有兴趣做正确的事情,在我看来,正如我的经验所说,有一种技术专为这种逻辑而设计。

6- .NET 进程间通信或 IPC(代码示例)(codeguru 简介

IPC 基于 .NET 远程处理(我个人认为 .NET 中最有趣的讨论)但无论名称如何,它不仅用于远程通信。远程处理有很多部分,其中包括进程间通信 (IPC)。这很难,但如果你问我,这是最好的方法。

干杯

于 2012-11-12T16:36:42.143 回答