Tengo una situación donde deseo ejecutar un archivo, y después suprimir el archivo ejecutable cuando se realiza la ejecución. Utilizo System. Diagnostics. Process. Start () para ejecutar el archivo y utilizar. WaitForExit () para esperar a que se complete el proceso. A continuación, utilizar File. Delete (filename) para eliminar el archivo ejecutable. El problema es que a veces, File. Delete fallará con el siguiente error: Esto me lleva a creer que, de alguna manera, el proceso todavía está vivo y bloquear el archivo ejecutable incluso después de la llamada. WaitForExit () devuelve. He encontrado otros hilos en la red que describen el mismo comportamiento, pero no he encontrado ninguno que concluya con una explicación o solución razonable al problema, aparte de las sugerencias de colocar un Sleep (n) después de WaitForExit (). Ejemplos: Aquí hay un programa de ejemplo que reproduce el problema para mí. He probado en Windows XP y Windows 7, y ambos finalmente fallan en algún momento con el mismo error. También tenga en cuenta que el ejecutable ss. exe es una sencilla aplicación de consola quotHello Worldquot. Y la salida típicamente parece algo así (con una cantidad variable de iteraciones antes de que ocurra el fallo): Cualquier idea sobre por qué sucede esto, y si hay alguna solución para esto (aparte de poner duerme en el código) Friday, January 08, 2010 3 : 40 PM La razón es que aunque el proceso se completa, puede tomar unos milisegundos para que el sistema operativo termine de destruirlo. Es un sistema operativo multitarea después de todo, su tratando de servicio a todos al mismo tiempo. Infortunadamente, no hay manera de saber cuando el archivo ya no está bloqueado (presicely). Cuando se espera de WaitForExit, está creando un objeto de bloqueo en el objeto de proceso. El objeto del proceso no puede ser destruido hasta que se libere el bloqueo y no se puede esperar algo que no existe (tipo de huevo y pollo). Así que lo único razonable que puedes hacer es seguir intentándolo, algo como: Marcado como respuesta por Samuel Stanojevic Viernes, 08 de Enero de 2010 16:20 Editado por Tergiver viernes, 08 de enero de 2010 16:20 cambiado a bool, loop infinito Corrección Viernes, 08 de Enero de 2010 16:15 Microsoft está llevando a cabo una encuesta en línea para entender su opinión sobre el sitio web Msdn. Si decide participar, se le presentará la encuesta en línea cuando abandone el sitio Web de Msdn. ¿Te gustaría participar? Tu solución no necesita AutoResetEvent pero encuestas. 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 ImplementationSystem. Diagnostics. ProcessStartInfoClass Asamblea: System. dll Espacio de nombres: System. Diagnostics Resumen Especifica un conjunto de valores utilizados al iniciar un proceso. C Sintaxis: public sealed class ProcessStartInfo Comentarios ProcessStartInfo se utiliza junto con el componente de proceso. Cuando inicia un proceso utilizando la clase Process, tiene acceso a la información del proceso además de la que está disponible al conectarse a un proceso en ejecución. Puede utilizar la clase ProcessStartInfo para un mayor control sobre el proceso que inicie. Debe definir al menos la propiedad ProcessStartInfo. FileName, manualmente o utilizando el constructor. El nombre del archivo es cualquier aplicación o documento. Aquí, un documento se define como cualquier tipo de archivo que tiene una acción abierta o predeterminada asociada con él. Puede ver los tipos de archivo registrados y sus aplicaciones asociadas para su computadora mediante el diálogo Opciones de carpeta disponible en el sistema operativo. El botón Avanzado conduce a un diálogo que muestra si hay una acción abierta asociada con un tipo de archivo registrado específico. Además, puede establecer otras propiedades que definan las acciones que se van a tomar con ese archivo. Puede especificar un valor específico para el tipo de la propiedad ProcessStartInfo. FileName de la propiedad System. Diagnostics. ProcessStartInfo. Verb (no admitida en la CLI de origen compartido). Por ejemplo, puede especificar la impresión de un tipo de documento. Además, puede especificar valores de propiedad ProcessStartInfo. Arguments para que sean argumentos de línea de comandos para pasar al procedimiento open de archivos. Por ejemplo, si especifica una aplicación de editor de texto en la propiedad ProcessStartInfo. FileName, puede utilizar la propiedad ProcessStartInfo. Arguments para especificar un archivo de texto que debe abrir el editor. La entrada estándar suele ser el teclado, y la salida estándar y el error suelen ser la pantalla del monitor. Sin embargo, puede utilizar ProcessStartInfo. RedirectStandardInput. ProcessStartInfo. RedirectStandardOutput y ProcessStartInfo. RedirectStandardError para hacer que el proceso obtenga la entrada o devuelva la salida a un archivo u otro dispositivo. Si utiliza Process. StandardInput. Process. StandardOutput. O Process. StandardError en el componente de proceso, primero debe establecer el valor correspondiente en la propiedad ProcessStartInfo. De lo contrario, el sistema emitirá una excepción al leer o escribir en el flujo. Establezca ProcessStartInfo. UseShellExecute para especificar si se debe iniciar el proceso utilizando el shell del sistema operativo. Puede cambiar el valor de cualquier propiedad ProcessStartInfo hasta el momento en que se inicia el proceso. Después de iniciar el proceso, el cambio de estos valores no tiene ningún efecto. System. Diagnostics. ProcessStartInfo Lista de miembros: constructor predeterminado. Este constructor es llamado por constructores de clase derivados para inicializar el estado en este tipo. Inicializa una nueva instancia de la clase ProcessStartInfo sin especificar un nombre de archivo con el que iniciar el proceso. Sobrecargado:.ctor (string fileName) Inicializa una nueva instancia de la clase ProcessStartInfo y especifica un nombre de archivo como una aplicación o documento con el que iniciar el proceso. Sobrecargado:.ctor (string fileName, argumentos de cadena) Inicializa una nueva instancia de la clase ProcessStartInfo y especifica un nombre de archivo de aplicación con el que iniciar el proceso, así como un conjunto de argumentos de línea de comandos para pasar a la aplicación. Gest o establece el conjunto de argumentos de línea de comandos que se utilizarán al iniciar la aplicación. Obtiene rutas de búsqueda de archivos, directorios de archivos temporales, opciones específicas de la aplicación y otra información similar. System. Diagnostics. ProcessStartInfo Detalles del miembro Sobrecargado ctor 1 Resumen Inicializa una nueva instancia de la clase ProcessStartInfo sin especificar un nombre de archivo con el que iniciar el proceso. Constructor predeterminado. Este constructor es llamado por constructores de clase derivados para inicializar el estado en este tipo. C Sintaxis: Comentarios Debe establecer al menos la propiedad ProcessStartInfo. FileName antes de iniciar el proceso. El nombre del archivo es cualquier aplicación o documento. En este caso, un documento se define como cualquier tipo de archivo que tenga una acción abierta o predeterminada asociada con él. Puede ver los tipos de archivo registrados y sus aplicaciones asociadas para su computadora mediante el diálogo Opciones de carpeta disponible en el sistema operativo. El botón Avanzado conduce a un diálogo que muestra si hay una acción abierta asociada con un tipo de archivo registrado específico. Opcionalmente, también puede establecer otras propiedades antes de iniciar el proceso. La propiedad System. Diagnostics. ProcessStartInfo. Verb (no admitida en la fuente CLI compartida) proporciona acciones que se deben realizar, como print, con el archivo indicado en la propiedad ProcessStartInfo. FileName. La propiedad ProcessStartInfo. Arguments proporciona una forma de pasar argumentos de línea de comandos al archivo cuando el sistema lo abre. Sobrecargado ctor 2 Resumen Inicializa una nueva instancia de la clase ProcessStartInfo y especifica un nombre de archivo como una aplicación o documento con el que iniciar el proceso. C Sintaxis: Una aplicación o documento con el que iniciar un proceso. Comentarios El nombre de archivo es cualquier aplicación o documento. En este caso, un documento se define como cualquier tipo de archivo que tenga una acción abierta o predeterminada asociada con él. Puede ver los tipos de archivo registrados y sus aplicaciones asociadas para su computadora mediante el diálogo Opciones de carpeta disponible en el sistema operativo. El botón Avanzado conduce a un diálogo que muestra si hay una acción abierta asociada con un tipo de archivo registrado específico. Puede cambiar la propiedad ProcessStartInfo. FileName después de llamar a este constructor, hasta el momento en que se inicia el proceso. Después de iniciar el proceso, el cambio de estos valores no tiene ningún efecto. Sobrecargado ctor 3 Resumen Inicializa una nueva instancia de la clase ProcessStartInfo y especifica un nombre de archivo de aplicación con el que iniciar el proceso, así como un conjunto de argumentos de línea de comandos para pasar a la aplicación. C Sintaxis: Una aplicación con la que iniciar un proceso. Argumentos de línea de comandos para pasar a la aplicación cuando se inicia el proceso. Comentarios El nombre de archivo es cualquier aplicación o documento. En este caso, un documento se define como cualquier tipo de archivo que tenga una acción abierta o predeterminada asociada con él. Puede ver los tipos de archivo registrados y sus aplicaciones asociadas para su computadora mediante el diálogo Opciones de carpeta disponible en el sistema operativo. El botón Avanzado conduce a un diálogo que muestra si hay una acción abierta asociada con un tipo de archivo registrado específico. Puede cambiar las propiedades ProcessStartInfo. FileName o ProcessStartInfo. Arguments después de llamar a este constructor hasta el momento en que se inicia el proceso. Después de iniciar el proceso, el cambio de estos valores no tiene ningún efecto. Propiedad: Argumentos (lectura-escritura) Resumen Gest o establece el conjunto de argumentos de línea de comandos que se utilizarán al iniciar la aplicación. C Sintaxis: Propiedad: EnvironmentVariables (sólo lectura) Resumen Obtiene rutas de búsqueda de archivos, directorios de archivos temporales, opciones específicas de la aplicación y otra información similar. C Sintaxis: Propiedad: RedirectStandardError (lectura-escritura) Resumen Obtiene o establece un valor que indica si la salida de error del proceso se escribe en el miembro Procesos del proceso Process. StandardError, permitiéndole escribir en un destino distinto al flujo de error estándar pantalla del monitor). Se utiliza para escribir datos de error en un archivo o en un registro, por ejemplo. C Sintaxis: Remarks El componente de proceso se comunica con un proceso secundario a través de una canalización. Si un proceso hijo escribe suficientes datos en el conducto para llenar el búfer, el niño bloqueará hasta que el padre lea los datos del tubo. Esto puede causar bloqueo si su aplicación está leyendo toda la salida a error estándar y salida estándar, por ejemplo, utilizando el siguiente código C. En este caso, tanto el padre como los procesos secundarios estarían bloqueados, ya que el canal lleno impide que el proceso secundario se complete, mientras que el proceso padre está esperando indefinidamente para que el proceso secundario salga. Este problema se puede resolver moviendo el ReadToEnd () antes de WaitForExit (). como sigue. Un problema similar se plantea si redirigir la salida estándar y el error estándar y, a continuación, intente leer ambos, por ejemplo, utilizando el siguiente código C. En este caso, si el proceso secundario escribe cualquier texto al error estándar, bloqueará el proceso, ya que el proceso padre no puede leer del error estándar hasta que haya terminado de leer desde la salida estándar. Sin embargo, el proceso padre no leerá desde la salida estándar hasta que finalice el proceso. Una solución recomendada a esta situación es crear dos subprocesos para que la aplicación pueda leer la salida de cada secuencia en un subproceso independiente. Propiedad: RedirectStandardInput (lectura-escritura) Resumen Obtiene o establece un valor que indica si se lee la entrada del comando de proceso desde el elemento Procesos Process. StandardInput del proceso, lo que le permite leer desde una fuente distinta a la corriente de entrada estándar (normalmente el teclado). Se utiliza para leer datos de un archivo, por ejemplo. C Sintaxis: Propiedad: RedirectStandardOutput (lectura-escritura) Resumen Obtiene o establece un valor que indica si la salida del proceso se escribe en las instancias de proceso Process. StandardOutput miembro, lo que le permite escribir en un destino que no sea el flujo de salida estándar pantalla). Se utiliza para escribir datos en un archivo, por ejemplo. C Sintaxis: Remarks El componente de proceso se comunica con un proceso secundario a través de una canalización. Si un proceso hijo escribe suficientes datos en el conducto para llenar el búfer, el niño bloqueará hasta que el padre lea los datos del tubo. Esto puede causar bloqueo si su aplicación está leyendo toda la salida a error estándar y salida estándar, por ejemplo, utilizando el siguiente código C. En este caso, tanto el padre como los procesos secundarios estarían bloqueados, ya que el canal lleno impide que el proceso secundario se complete, mientras que el proceso padre está esperando indefinidamente para que el proceso secundario salga. Este problema se puede resolver moviendo el ReadToEnd () antes de WaitForExit (). como sigue. Un problema similar se plantea si redirigir la salida estándar y el error estándar y, a continuación, intente leer ambos, por ejemplo, utilizando el siguiente código C. En este caso, si el proceso secundario escribe cualquier texto al error estándar, bloqueará el proceso, ya que el proceso padre no puede leer del error estándar hasta que haya terminado de leer desde la salida estándar. Sin embargo, el proceso padre no leerá desde la salida estándar hasta que finalice el proceso. Una solución recomendada a esta situación es crear dos subprocesos para que la aplicación pueda leer la salida de cada secuencia en un subproceso independiente. Propiedad: UseShellExecute (lectura-escritura) Resumen Obtiene o establece un valor que indica si se utiliza el shell del sistema operativo para iniciar el proceso. C Sintaxis: Comentarios Establecer esta propiedad en false le permite redirigir los flujos de entrada, salida y error. Cuando utiliza el shell del sistema operativo para iniciar procesos, puede iniciar cualquier documento (que es cualquier tipo de archivo registrado asociado a un archivo ejecutable que tiene una acción abierta predeterminada) y realizar operaciones en el archivo, como la impresión, con el proceso componente. Cuando ProcessStartInfo. UseShellExecute es false. Puede iniciar sólo ejecutables con el componente Proceso. Propiedad: WorkingDirectory (lectura-escritura) Resumen Obtiene o establece el directorio inicial para el proceso que se iniciará. C Sintaxis: Comentarios Si el directorio ya forma parte de la variable de ruta del sistema, no es necesario repetir la ubicación del directorys en esta propiedad.
Buscar en el foro Facebook Forex Trading System forex forex piratage facebook facebook forex piratage facebook Encuentra forex piratage facebook Forex Trading Service website Forex Trading System forex piratage facebook facebook forex piratage facebook Encuentra forex piratage facebook Forex Trading en línea servicio web wa forex Piratage facebook Buscar wa forex piratage facebook Sitio web del servicio de Forex Trading en línea Forex Trading System facebook facebook forex piratage facebook Buscar forex piratage facebook Sitio web del servicio de Forex Trading en línea Forex Trading System facebook forex piratage facebook Encuentra wa forex piratage facebook En línea Si usted es nuevo en el comercio de divisas, ¿sabe qué tipos de indicadores técnicos son para qué tipos de operaciones Y si ya eres un comerciante de la divisa con experiencia, ¿es usted Utilizando las combinaciones correctas de indicadores técnicos para ayudarle a obtener...
Comments
Post a Comment