2016-12-05 4 views
2

Я использую класс процесса C# для открытия отдельного приложения, которое не имеет графического интерфейса. это проект C++, в котором я использую Process.Kill(), чтобы закончить его. Проблема в том, что это не дает ему возможности закончить свои действия. Process.Close() просто освобождает объект в моем основном приложении и оставляет отдельное приложение.C# изящно закрыть отдельное приложение, которое не имеет UI

Каков наилучший способ сделать этот процесс изящным?

+0

Класс должен иметь метод Dispose(), который выполняет очистку и закрывает любые объекты, которые необходимо закрыть (или прекратить выполнение). – jdweng

+0

Я думаю, вы не должны использовать Process.Kill(). Скорее отправьте сообщение (udp ...) между двумя приложениями и, когда закончите, его действия убьют. –

+0

[Также есть пример для async:] (http://stackoverflow.com/a/611127/3060520) –

ответ

1

В прошлом мне нужно было запустить инструмент не-gui C# из инструмента GUI C#, оба из которых я написал. Я использовал стандартные потоки ввода/вывода для обмена данными между обоими инструментами.

Вы можете заставить свой инструмент C++ прослушивать его stdin для команды, которая указывает, что инструмент должен выйти изящно. Затем, в своем приложении C#, отправьте команду quit, подождите достаточное количество времени, и если инструмент не закончится к тому времени, убейте его.

Я сожалею, что мой C++ не достаточно хорошо, чтобы дать вам пример для стороны C++, но следующие строки используются в моей C# проекта сказать внешний процесс до конца:

m_consoleProcess.StandardInput.WriteLine("QUIT"); 
m_consoleProcess.WaitForExit(10000); 
if (!m_consoleProcess.HasExited) 
{ 
    m_consoleProcess.Kill(); 
} 

Если вам нужно управлять отдельными внешними процессами, конечно, вам нужно сохранить один экземпляр Process для каждого из них, и вам нужно обработать случай, когда внешний процесс был завершен до того, как ваше приложение завершит работу.