Por razones de aislamiento y estabilidad de la memoria, necesito ejecutar algunos métodos / clases como subprocesos, no como hilos. Encontré la siguiente biblioteca que me permite hacer precisamente eso: https://github.com/tmds/Tmds .ExecFunction.

Sin embargo, parece que no puedo encontrar una manera de obtener el ID de proceso del proceso secundario.

ExecFunction.Run(() => new NewSubProcessClass());

El código anterior generará un nuevo proceso e incluso generará una salida de consola en un contenedor Docker de Linux. El problema es que no tengo ID de proceso.

public static Process Start(Action action, Action<ExecFunctionOptions> configure = null);

Sin embargo, el método que cité anteriormente parecía que debería funcionar, cuando reemplazo

ExecFunction.Run(() => new NewSubProcessClass());

Con

Process process = ExecFunction.Start(() => new NewSubProcessClass());

Ya no obtengo ninguna salida de consola.

ACTUALIZACIÓN 0:

La sugerencia de @bazzilic

process.WaitForExit();

Es la solución al problema.

3
Willi 20 ene. 2021 a las 17:32

1 respuesta

La mejor respuesta

Si examina el código fuente de Tmds.ExecFunction, ambos métodos .Run(...) (aquí) y .Start(...) (aquí) bajo el capó llamar al mismo método privado .Start(...) (fuente aquí). Las dos diferencias son:

  1. el método público .Start(...) devuelve el objeto process de la tupla devuelta por el método privado .Start(...) mientras que .Run(...) no lo hace;
  2. el método .Run(...) también proporciona waitForExit: true en los parámetros.

En el código del método privado .Start(...), hay esta parte:

if (waitForExit)
{
    process.WaitForExit();
}

Aparte de eso, los dos métodos públicos son idénticos. Lo más probable es que la diferencia en el comportamiento de su código se deba a no esperar a que el proceso hijo termine en su proceso padre. Prueba esto:

Process process = ExecFunction.Start(() => new NewSubProcessClass());
process.WaitForExit();

PD: tenga en cuenta que Process es IDisposable, por lo que podría ser mejor hacerlo

using ( Process process = ExecFunction.Start(() => new NewSubProcessClass()) ) {
    process.WaitForExit();
}
1
bazzilic 20 ene. 2021 a las 17:08