Llamar ejecutable utilizando procesos se bloquea intermitentemente

votos
2

Estoy llamando a un ejecutable en C #. Cuando se ejecuta el ejecutable, se escribe en la consola para que el código C # obtenga la salida de la consola y lo escriba en un archivo de texto. Cuando ocurre el choque, ocurren un par de cosas.

1) La salida del archivo de texto no está completamente escrita. 2) El proceso ejecutable parece ejecutarse completamente porque genera un informe al igual que una ejecución exitosa.

Sospecho que la razón de este bloqueo se debe a la forma en que estoy escribiendo el archivo.

Actualización: - En cuanto al bloqueo, aparece un diálogo que dice que el administrador ha encontrado un problema y debe cerrarse. Lamentamos las molestias. Luego tiene un botón OK. Cuando hace clic en Aceptar, hay un cuadro de diálogo que tengo configurado que me pregunta si deseo iniciar el administrador nuevamente.

  • La aplicación de administrador que está llamando al ejecutable tiene un solo subproceso. El ejecutable puede ejecutar múltiples subprocesos.

Aquí hay un pequeño fragmento de la llamada:

  // Set up process to redirect standard output and standard error to
  // a file.
     process.StartInfo.UseShellExecute = false;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     FileInfo ofi = new FileInfo(outputPath);
     FileStream ofs = ofi.OpenWrite();
     StreamWriter sw = new StreamWriter(ofs);
     WriteToTextWriterEventHandler wtsweh = new WriteToTextWriterEventHandler(sw);
     DataReceivedEventHandler handler = wtsweh.HandleDataReceived;
     process.OutputDataReceived += handler;
     process.ErrorDataReceived += handler;
     //

     statusAcceptor.ReportStatus(Running process.);
     process.Start();
     process.BeginOutputReadLine();
     process.BeginErrorReadLine();

     statusAcceptor.ReportStatus(Waiting for process to complete.);
     process.WaitForExit();
     int processExitCode = process.ExitCode;
     process.Close();
     sw.Close();


  // 
  private class WriteToTextWriterEventHandler
  {
      private TextWriter tw;

      public WriteToTextWriterEventHandler(TextWriter tw)
      {
          this.tw = tw;
      }

      public void HandleDataReceived(object sendingProcess,
         DataReceivedEventArgs outLine)
      {
          // Collect the sort command output.
          if (!String.IsNullOrEmpty(outLine.Data))
          {
              tw.Write(Environment.NewLine + outLine.Data);
          }
      }
  }
Publicado el 09/12/2008 a las 20:53
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
1

Probablemente esté en sus controladores. Debe poner en lógica para manejar las excepciones lanzadas por los manejadores de flujo y debe poner en un mecanismo para asegurarse de que los manejadores de flujo se cierren adecuadamente antes de que se cierre el proceso. Problemas como este son difíciles de precisar debido a los problemas de sincronización con los controladores de eventos y el proceso. Cierre para que no me sorprenda que otros carteles no hayan podido reproducirlo. Pero lo he visto en acción. El problema es que EventHandler está activo hasta que se cierra al llamar a cancelErrorRead o cancelOutputRead o el proceso sale. Bueno, si todavía está ocupado limpiando algunos resultados desde el final del proceso, mientras que el hilo principal llega a Process.Close ... BOOM

Respondida el 10/12/2008 a las 14:26
fuente por usuario

votos
1

Si adjunta un depurador al proceso de bloqueo, sabrá exactamente por qué se estrelló. Aquí hay un tutorial detallado sobre los errores de depuración: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

Respondida el 10/12/2008 a las 05:11
fuente por usuario

votos
1

Intente agregar un color después de tw.Write. Eso debería causar la salida completa hasta el punto de falla, lo que puede incluir mensajes de error del ejecutable (si eso es lo que falla?)

Respondida el 09/12/2008 a las 23:27
fuente por usuario

votos
1

¿Cuál es el choque que estás recibiendo? Una excepción .Net?

El hecho de que el archivo no se haya escrito por completo podría deberse a que no vacía la secuencia en el archivo y luego lo cierra.

Creo que podría ser un problema utilizar la misma secuencia para los mensajes estándar de salida y error. Esto podría conducir a problemas de concurrencia.

Respondida el 09/12/2008 a las 21:05
fuente por usuario

votos
0

Probé tu código con varios ejecutables diferentes y no pude hacer que se bloqueara de la manera que describes. Tal vez es un problema con el proceso que está ejecutando?

Respondida el 09/12/2008 a las 23:38
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more