【问题标题】:How do i exit a running console app?如何退出正在运行的控制台应用程序?
【发布时间】:2018-06-30 01:28:01
【问题描述】:

抱歉标题不好,但我不知道如何描述它。

我正在构建一个控制台应用程序。一般的想法是,当输入这样的命令时,它会永久运行(并做一些后台工作):

App.exe run 

然后我想在进入时终止应用程序

App.exe exit

你会怎么做?当我想要这种行为时,我需要记住什么吗?还是有更好的办法?

我知道 args[] 存储了所有参数,但是您将如何“找到”另一个正在运行的进程并终止它?据我了解,在运行然后退出时,我只需打开程序两次。所以exit需要关闭正在运行的进程和自身。

【问题讨论】:

  • 我假设你想关闭App.exe run所有个正在运行的实例?您是否要允许这些实例在它们退出之前执行任何清理?做对是相当棘手的。
  • 是的。清理使整个事情变得更加复杂是的。有没有更好的方法来解决这个问题?
  • 没有标准的方法来做到这一点,你必须与进程的运行实例交谈,告诉它它需要终止。是您自己这样做还是留给 app.exe 的第二个实例来查找第一个实例取决于您自己。通常使用命名管道完成。通常只使用 Process.Kill() 应用程序要容易得多。
  • 我建议的某种外部钩子(或@SlimsGhost 也提到过)将允许您“干净地”退出第一个实例,因为您只需轮询该钩子,然后当它更改时您可以清理并退出当你想要的时候。

标签: c# .net-core console-application


【解决方案1】:

我的一个想法是使用注册表项,所以当第一个 App.exe run 被执行时,它会将注册表项设置为某个值(即true)并定期检查它是否仍然是@987654324 @ 如果不是,则使用 Environment.Exit(0) 关闭。

现在您的App.exe exit 需要将该注册表项更新为false。这似乎是一个相当紧凑的解决方案,因为您不必担心找到某个进程并杀死它,事实上,两个程序执行都不必知道另一个,因为它只是更新注册表项。

另一种解决方案是对临时文本文件执行相同的操作,但我建议在此之前使用注册表项选项。

这里有一些关于RegistryKey 类的文档供您参考。我在以前的项目中使用过很多次,所以它应该适用于您的情况。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registrykey?view=netframework-4.7.1

为了让您开始使用此选项,我将在软件配置单元中手动创建密钥,然后使用以下命令访问它。

RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software");

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是只允许应用程序的一个实例运行。

    这个question 提供了创建单实例应用的解决方案。 调用应用程序时,您可以验证是否已经有一个正在运行的实例并关闭该实例(提供的问题已经有解决方案)。

    【讨论】:

      【解决方案3】:

      根据@ivcubr(和其他人)的答案,您有一些简单的选择:

      1. 利用操作系统查找和终止进程(例如,使用 pid 和某种“kill”)
      2. 使用命名管道或任何其他类型的 IPC 在应用程序实例之间直接通信
      3. 使用外部挂钩。这可以是注册表项、任何类型的文件系统文件或数据库。它可以是您的应用(所有实例)可以定期轮询(或在更改时收到通知)以查看您的应用实例何时退出的任何内容。

      我认为 #3 是最容易实现的,除非您已经有使用选项 #1 或 #2 的先例(或其他充分理由)。

      【讨论】:

        【解决方案4】:

        你可以使用Application.Exit()方法

        【讨论】:

        • 所以当我运行 App.exe 时,它​​会启动整个进程。如果我想关闭它,我会退出 App.exe,但现在我只关闭进程的第二个实例,而不是第一个(正在运行的)进程
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 2014-02-17
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        相关资源
        最近更新 更多