es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ejecutar un ScriptBlock con SessionState correctamente dentro de un ICommandPredictor?

Hola, estoy intentando ejecutar un ScriptBlock con un SessionState específico dentro de un ICommandPredictor, pero si el ScriptBlock tiene un pipe, simplemente se cuelga para siempre (podría ser un bloqueo).

Tengo un proyecto que recrea el problema aquí.

Para recrear el problema:
1. Clona el repositorio
2. Ábrelo en Visual Studio 2021.
3. Establece un punto de interrupción en Predictor.cs en la línea 23.
4. Inicia con la depuración.
5. Escribe un carácter en la terminal que se abre.
6. Visual Studio debería aparecer con el punto de interrupción activado.
7. Pulsa F10 (Paso).
8. Nunca llegarás a la línea 28 o 31, ya que estamos atascados.

Así que podría haber hecho algo mal en cómo ejecuto ScriptBlocks…
Pero el flujo es:
1. Cuando se inicia la Terminal, ejecuta Install-ScriptBlock.
1. Esto ejecuta un ScriptBlock con una nueva sesión que a su vez ejecuta set-scriptblock, set-scriptblock almacena el ScriptBlock proporcionado y el nuevo SessionState.
2. Crea un ICommandPredictor y regístrelo en el Subsistema.
2. Cuando escribes en la Terminal, se invoca el ICommandPredictor, que a su vez intenta ejecutar el ScriptBlock que se guardó con set-scriptblock utilizando la misma sesión.

Espero que esto tenga sentido y sé que el flujo es algo confuso, pero no puedo eliminar ninguno de los pasos del flujo sin arruinar mi caso de uso…

Entonces, ¿hay alguna manera de cambiar esto para permitirme ejecutar un ScriptBlock dentro de un ICommandPredictor con un SessionState que se creó al ejecutar un ScriptBlock sin que se cuelgue?

En caso de que mi enlace se rompa, aquí está el código completo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser causado por ejecutar un ScriptBlock con un pipe dentro de un ICommandPredictor con un SessionState específico. El flujo del proyecto es algo complicado, pero eliminar cualquiera de los pasos rompería el caso de uso. El problema ocurre cuando el ICommandPredictor intenta ejecutar el ScriptBlock guardado con el mismo SessionState.

    Para solucionar este problema, algunos enfoques posibles podrían ser:

    1. Ejecutar el ScriptBlock sin un SessionState específico dentro del ICommandPredictor. Esto puede no ser posible si el SessionState es necesario para que el script se ejecute correctamente.
    2. Crear un nuevo SessionState para cada ejecución de ScriptBlock dentro del ICommandPredictor. Esta podría ser una solución, pero podría tener un alto costo si se ejecutan múltiples ScriptBlocks con frecuencia.

    3. Investigar y resolver la causa raíz del problema de bloqueo. Este podría ser un tema complejo y que requiere tiempo para resolver, pero podría ser la mejor solución a largo plazo.

    En general, la mejor solución depende de los requisitos y restricciones específicos del caso de uso.

Comments are closed.