Saturday 31 December 2016

Espera

El código parece casi esto: Como se puede ver, el código inicia un proceso cmd. exe y le pasa el comando que quiero que se ejecute. Redirecciono StandardError y StandarOutput para leerlos desde el código. El código los lee antes del proceso. WaitForExit (Timeout) llamada como recomendado por Microsoft (más sobre esto más adelante). El problema surge si el comando que envío a cmd. exe nunca termina o se bloquea indefinidamente. En el código he utilizado el comando ping - t 8.8.8.8 que, debido a la opción - t, pings el host sin detenerse. Qué ocurre? El proceso cmd. exe junto con el comando ping - t nunca sale y nunca cierra el flujo stdout y por lo tanto nuestro código se cuelga en la línea Output. StandardOutput. ReadToEnd () porque no puede tener éxito leyendo todo el flujo. Lo mismo sucede también si un comando en un archivo por lotes cuelga por cualquier razón y por lo que el código anterior podría trabajar continuamente durante años y luego colgar de repente sin ninguna razón aparente. Antes de escribir que su recomendado para leer los flujos redirigidos antes del proceso. WaitForExit (Timeout) llamada, esto es especialmente cierto si utiliza la firma WaitForExit sin el tiempo de espera. Si llama al proceso. WaitForExit () antes de leer los flujos redirigidos: código 2: puede experimentar un interbloqueo si el comando que adjuntas a cmd. exe o el proceso que estás llamando llena la salida estándar o el error estándar. Esto porque nuestro código no puede alcanzar las líneas de proceso de salida. StandardOutput. ReadToEnd () Como cuestión de hecho el proceso hijo (el comando ping o un archivo por lotes o cualquier proceso que está ejecutando) no puede seguir si nuestro programa no lee los buffers llenos de los arroyos y esto no puede suceder porque el código está colgando en La línea con el proceso. WaitForExit () que esperará siempre para que el proyecto secundario salga. El tamaño predeterminado de ambas secuencias es 4096 bytes. Puede probar estos dos tamaños con estos archivos por lotes: El primer guión escribe 4096 bytes en la salida estándar y el segundo en el error estándar. Guarde uno de estos en C: testbuffsize. bat y ejecute nuestro proceso de llamada al programa. WaitForExit () antes de proceso de salida. StandardOutput. ReadToEnd () como en el código 2. puede hacerlo escribiendo CommandResult Resultado ExecuteShellCommandSync (c: testbuffsize. bat, 1000) en la línea 13 del código 1. El código suele pasar el rato, pero si se escribe un byte más en cualquiera de las dos corrientes que se desborde el tamaño del búfer haciendo que el programa colgar. Si necesita redirigir y leer la salida estándar o el error estándar, la mejor solución es leerlos de forma asíncrona. Una excelente manera de hacerlo es propuesta por Mark Byers en este hilo de stackoverflow. Como último aspecto, observe que si el proceso secundario sale sólo porque utiliza el proceso. WaitForExit (Timeout) firma y en realidad va en tiempo de espera que debe matar el proceso cmd. exe y sus posibles hijos. Su solución no necesita AutoResetEvent pero encuesta. Cuando haces sondeo en lugar de utilizar el evento (cuando están disponibles), entonces estás usando la CPU sin ninguna razón y eso indica que eres un programador defectuoso. Su solución es realmente mala cuando se compara con la otra utilizando AutoResetEvent. (Pero no te di -1 porque trataste de ayudar). Ndash Eric Ouellet Nov 7 14 at 18:38 Yo estaba teniendo el mismo problema, pero la razón era diferente. Sin embargo sucedería bajo Windows 8, pero no bajo Windows 7. La línea siguiente parece haber causado el problema. La solución era NO deshabilitar UseShellExecute. Ahora recibí una ventana emergente de Shell, que no es deseada, pero mucho mejor que el programa esperando que nada particular suceda. Así que añadí el siguiente trabajo para que: Ahora lo único que me molesta es por qué esto está sucediendo bajo Windows 8 en el primer lugar. Respondió Jan 13 15 at 10:35 Ejemplo de uso ImplementaciónIve miró en diferentes hilos sobre esto, pero todos ellos usan el Process. RedirectStandardOutput True, que yo no. Estoy tratando de abrir un proceso (aplicación de consola, no hecha por mí) para que compile un archivo. acs especial a un archivo. o. La estructura es simple, el único argumento es el archivo que desea compilar. Pero en ciertos archivos mi aplicación se bloquea al intentar abrir el proceso. Aquí está mi código: Para iniciar el proceso uso casi el mismo código que otro chico en C. Y su código funciona perfectamente. Espero que tu día haya sido mejor que ayer, pero que es peor que mañana. Por favor marque como respuesta si solucioné su problema. ) Editado por Visual Vincent sábado, 03 de enero de 2015 2:57 PM Ha comparado los FileNames y Argumentos de los que funcionan y los que no hay alguna diferencia en ellos como los que trabajan no contienen espacios en blanco en el FileName O argumentos y los que trabajan no contienen espacios en blanco en ellos Si usted encuentra que para ser el problema, entonces usted necesita para añadir cotizaciones al principio y al final de la FileName o Argumentos. Mi primera conjetura es los argumentos necesita las citas como esto porque, veo espacios en blanco en su ejemplo de los argumentos. Ps. Argumentos Chr (34) amp SavePath amp Chr (34) Si dices que no se puede hacer entonces lo intentaré mal Editado por IronRazerz sábado, 03 de enero de 2015 3:51 PM Marcado como respuesta por Visual Vincent Sábado 03 de Enero de 2015 4:33 PM Saturday, January 03, 2015 3:41 PM Todas las respuestas Has comparado los FileNames y Argumentos de los que funcionan y los que no hay alguna diferencia en ellos como los que trabajan no contienen espacios en blanco en el FileName o argumentos y los que trabajan no contienen espacios en blanco en ellos Si encuentra que para ser el problema, entonces usted necesita para añadir cotizaciones al principio y al final de la FileName o Argumentos. Mi primera conjetura es los argumentos necesita las citas como esto porque, veo espacios en blanco en su ejemplo de los argumentos. Ps. Argumentos Chr (34) amp SavePath amp Chr (34) Si dices que no se puede hacer entonces lo intentaré mal Editado por IronRazerz sábado, 03 de enero de 2015 3:51 PM Marcado como respuesta por Visual Vincent Sábado 03 de Enero de 2015 Has probado el mismo comando manualmente en una ventana de consola? Tal vez se detiene y espera algo. O no establezca CreateNoWindow. ErrorDialog y WIndowStyle y ver qué pasa. Has comparado los FileNames y Argumentos de los que funcionan y los que no hay alguna diferencia en ellos como los que Trabajo no contienen espacios en blanco en el nombre de archivo o argumentos y los que trabajan no contienen espacios en blanco en ellos Si encuentra que para ser el problema, entonces usted necesita para añadir cotizaciones al principio y al final de la FileName o Argumentos. Mi primera conjetura es los argumentos necesita las citas como esto porque, veo espacios en blanco en su ejemplo de los argumentos. Ps. Argumentos Chr (34) amp SavePath amp Chr (34) Si usted dice que no se puede hacer entonces mal probarlo Esto realmente lo hizo. Había olvidado que los espacios en blanco lo convierten en un nuevo argumento, tonto. No uso argumentos de proceso que a menudo. ) Espero que tu día haya sido mejor que ayer, pero que es peor que mañana. Por favor marque como respuesta si solucioné su problema. ) Editado por Visual Vincent sábado, 03 de enero de 2015 16:33


No comments:

Post a Comment