estoy usando CreateProcessAsUser en C# para poner en marcha un proceso por un servicio de mi servicio tiene que esperar a que el proceso para salir, pero yo no sé cómo puedo hacerlo, no quiero utilizar la comprobación de la existencia del proceso en la lista de procesosde espera para el proceso para salir al utilizar CreateProcessAsUser
Respuesta
Salida http://www.pinvoke.net/ para la firma. Aquí hay un ejemplo sime.
const UInt32 INFINITE = 0xFFFFFFFF;
// Declare variables
PROCESS_INFORMATION pi;
STARTUPINFO si;
System.IntPtr hToken;
// Create structs
SECURITY_ATTRIBUTES saThreadAttributes = new SECURITY_ATTRIBUTES();
// Now create the process as the user
if (!CreateProcessAsUser(hToken, String.Empty, commandLine,
null, saThreadAttributes, false, 0, IntPtr.Zero, 0, si, pi))
{
// Throw exception
throw new Exception("Failed to CreateProcessAsUser");
}
WaitForSingleObject(pi.hProcess, (int)INFINITE);
Puede usar GetExitCodeProcess, pero tenga en cuenta que esta función vuelve inmediatamente.
Otro enfoque es usar WaitForSingleObject. Pero esto requiere que el proceso se abra con la bandera SYNCHRONIZE. Ejemplo:
IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid);
if (hwnd != IntPtr.Zero) {
WaitForSingleObject(hwnd, INFINITE);
CloseHandle(hwnd);
}
CreateProcessAsUser
le devuelve una estructura PROCESS_INFORMATION
, que contiene hProcess
- identificador de proceso. Este es un identificador válido para las funciones WaitForSingleObject
/WaitForMultipleObjects
.
Los PROCESS_INFORMATION devuelve el identificador para el proceso de nueva creación (hProcess
), se puede esperar en esta manija que pasará a ser señalado cuando el proceso finalice.
Puede usar SafeWaitHandle encapsular el controlador y luego usar WaitHandle.WaitOne para esperar a que el proceso salga.
Aquí es cómo se envuelva el proceso de manejar
class ProcessWaitHandle : WaitHandle
{
public ProcessWaitHandle(IntPtr processHandle)
{
this.SafeWaitHandle = new SafeWaitHandle(processHandle, false);
}
}
Y luego el siguiente código se puede esperar en el mango
ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess);
waitable.WaitOne();
- 1. Java Class - No espere a que el proceso para salir
- 2. "Al salir" para una aplicación de consola
- 3. ¿Cómo diferenciar cuándo espera (tiempo de espera prolongado) salir para notificar o tiempo de espera?
- 4. ¿El lote se libera automáticamente al salir del proceso?
- 5. Problema con el proceso Salir
- 6. Esperando al pid de Ruby pid para salir
- 7. ¿Cómo obtengo un token de usuario válido para CreateProcessAsUser?
- 8. CreateProcessAsUser error 1314
- 9. Salir del proceso secundario después de os.fork()
- 10. ¿Salir de las variables de Rails al usarlas para Javascript?
- 11. jQuery espera para el evento para completar
- 12. Establecer el tiempo de espera para webClient.DownloadFile()
- 13. javascript salir para el bucle sin regresar
- 14. ¿El os.system() de Python espera el final del proceso?
- 15. ¿Cómo puedo especificar el límite de tiempo de espera para la llamada al sistema Perl?
- 16. Error al utilizar Crystal Reports para .net
- 17. MSDeploy: error al usar el proveedor runCommand para llamar al archivo .cmd remoto (tiempo de espera)
- 18. Java: utilizar StringBuilder para insertar al comienzo
- 19. Evento de perfil de Powershell "al salir"?
- 20. java Proceso de tiempo de espera nativa
- 21. sp_who2 Proceso espera de BlkBy comando
- 22. espera para JDialog para cerrar
- 23. Cómo matar el hilo al salir?
- 24. Tiempo de espera para thread.join()
- 25. Aumentando el tiempo de espera para .ashx
- 26. ¿Por qué los datos no se descargan al archivo al salir del proceso?
- 27. Aplicación falló el emulador para poner en marcha debido al tiempo de espera
- 28. ¿Cómo rastrear un proceso para llamadas al sistema?
- 29. establecer el tiempo de espera para el socket recibir
- 30. Tiempo de espera para BackgroundWorker
He añadido un ejemplo de cómo se puede envolver el identificador del proceso. –