Как выйти из запущенного консольного приложения? - PullRequest
0 голосов
/ 29 июня 2018

Извините за плохой заголовок, но я понятия не имел, как его описать.

Я создаю консольное приложение. Общая идея заключается в том, что он работает постоянно (и выполняет некоторые фоновые операции) при вводе такой команды:

App.exe run 

Я бы хотел закрыть приложение при вводе

App.exe exit

Как бы вы это сделали? Есть ли что-то, что мне нужно иметь в виду, когда я хочу такого поведения? Или есть лучший способ?

Я знаю, что в args [] хранятся все параметры, но как бы вы "нашли" другой запущенный процесс и завершили его? Насколько я понимаю, когда я выполняю команду run, а затем завершаю работу, я просто открываю программу два раза. Так что выход должен закрыть запущенный процесс и сам.

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

Немного основываясь на ответе @ivcubr (и других), у вас есть несколько простых вариантов:

  1. Использование ОС для поиска и уничтожения процессов (например, использование pid и немного разновидности "kill")
  2. Использование именованных каналов или любого другого типа IPC для прямой связи между экземплярами вашего приложения
  3. Используйте внешний крючок. Это может быть ключ реестра, любой файл файловой системы или база данных. Это может быть что угодно, что ваше приложение (все экземпляры) может периодически опрашивать (или получать уведомления при его изменении), чтобы узнать, когда пора выходить из ваших приложений.

Я думаю, # 3 проще всего реализовать, если у вас уже нет прецедента (или другой веской причины) для перехода с вариантом № 1 или № 2.

0 голосов
/ 29 июня 2018

Один из способов добиться этого - разрешить запуск только одного экземпляра приложения.

Этот вопрос содержит решения для создания приложения для одного экземпляра. При вызове приложения вы можете проверить, есть ли уже запущенный экземпляр, и закрыть этот экземпляр (указанный вопрос уже имеет решение для этого).

0 голосов
/ 29 июня 2018

Одна мысль, которую я имел, состояла в том, чтобы использовать ключ реестра, поэтому, когда выполняется первый App.exe run, он устанавливает ключ реестра на определенное значение (то есть true) и периодически проверяет, является ли он все еще * 1003. * а если нет, то использует 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");
0 голосов
/ 29 июня 2018

Вы можете использовать Application.Exit() метод

...