如何退出正在运行的控制台应用程序?

时间:2018-06-29 15:59:54

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

对不起,标题不好,但我不知道如何形容。

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

App.exe run 

然后我想在输入

时终止该应用程序
App.exe exit

您将如何做?当我想要这样的行为时,我需要记住什么吗?还是有更好的方法?

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

4 个答案:

答案 0 :(得分:1)

我曾经想过要使用注册表项,因此在执行第一个App.exe run时,它将注册表项设置为某个值(即true),并定期检查以查看是否仍为true,如果不是,则使用Environment.Exit(0)关闭。

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

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

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

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

以@ivcubr(及其他)的答案为基础,您有一些简单的选择:

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

我认为#3是最简单的实现方式,除非您已经具有使用选项#1或#2的先例(或另一个很好的理由)。

答案 3 :(得分:-1)

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