Я использую Chromium Embedded Framework 3 (через CEFGlue) для размещения браузера в стороннем процессе через плагин. CEF объединяет различные внешние процессы (например, процесс визуализации) и управляет временем их жизни.Управление временем жизни процесса Я не контролирую
Когда внешний процесс выходит из строя, вызывается CefRuntime.Shutdown
, и все процессы завершаются чисто. Когда сторонний процесс выходит из строя (например, он выходит из строя), я остаюсь с исполняемыми файлами CEF, которые все еще работают, и это (иногда) вызывает проблемы с хост-приложением, что означает, что он не запускается снова.
Я бы хотел, чтобы какой-либо способ, которым запускается приложение-хост, вызывается CefRuntime.Shutdown
, и пользователь не заканчивает работу ложных процессов.
Я указал в направлении объектов работы (см. here), но похоже, что это может быть сложно отправить в реальном решении, так как на некоторых версиях Windows ему требуются административные права.
Я мог бы также установить CEF для запуска в едином режиме процесса, но в документации указано, что это действительно для «отладки», поэтому я предполагаю, что доставка по производственному коде плохо по какой-либо причине (см. here).
Какие еще варианты у меня есть?
Следуя за комментариями, я попытался передать PID хост-процессу клиенту (я могу сделать это, переопределив OnBeforeChildProcessLaunch
). Я тогда создал простой сторожевой со следующим кодом:
ThreadPool.QueueUserWorkItem(_ => {
var process = Process.GetProcessById(pid);
while (!process.WaitForExit(5000)) {
Console.WriteLine("Waiting for external process to die...");
}
Process.GetCurrentProcess().Kill();
});
я могу проверить в отладчике, что этот код выполняет и что PID я передаю в него правильно. Однако, если я завершаю хост-процесс, я обнаружил, что поток просто умирает таким образом, что я не могу управлять, и что строки, следующие за циклом while
, никогда не выполняются (даже если я заменяю его Console.WriteLine
, я больше не вижу сообщений распечатано из этой темы.
Создайте сторожевой процесс для стороннего процесса, который запускает «CefRuntime.Shutdown» в случае, если приложение завершилось ненормальным способом. Сторожевой сторож должен только открыть процесс h andle (или он прошел/дублируется) и ['WaitForSingleObject'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx). – IInspectable