2014-09-15 8 views
1

Я использую 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, я больше не вижу сообщений распечатано из этой темы.

+1

Создайте сторожевой процесс для стороннего процесса, который запускает «CefRuntime.Shutdown» в случае, если приложение завершилось ненормальным способом. Сторожевой сторож должен только открыть процесс h andle (или он прошел/дублируется) и ['WaitForSingleObject'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx). – IInspectable

ответ

0

для потомков, решение было предложено @IInspectable работало, но для того, чтобы заставить ее работать мне пришлось переключить реализацию внешнего процесса использовать без многопоточного цикла обработки сообщений.

settings.MultiThreadedMessageLoop = false; 
CefRuntime.Initialize(mainArgs, settings, cefWebApp, IntPtr.Zero); 

Application.Idle += (sender,e) => { 
    if (parentProcess.HasExited) Process.GetCurrentProcess().Kill(); 
    CefRuntime.DoMessageLoopWork(); 
} 
Application.Run(); 
Смежные вопросы