Chamar executável usando o Process falha intermitentemente

votos
2

Eu estou chamando um executável em C #. Quando o executável funciona, ele escreve para o console para que o código C # está recebendo a saída do console e escrevê-lo em um arquivo de texto. Quando o acidente acontece um par de coisas ocorrem.

1) A saída do arquivo de texto não é completamente escrito. 2) O processo executável parece correr completamente através porque gera um relatório apenas como uma temporada de sucesso.

Eu suspeito que a razão para esta queda é por causa de como eu estou escrevendo o arquivo para fora.

Update: - Quanto ao acidente, uma caixa de diálogo aparece dizendo que o Gerenciador encontrou um problema e precisa ser fechado Lamentamos pela inconveniência.. Em seguida, ele tem um botão OK. Quando você clica em OK, há um diálogo que eu tenho configuração que pergunta se eu quero começar o gerente novamente.

  • O aplicativo gerenciador de que está chamando o executável é único segmento. O executável pode executar multi-threaded.

Aqui está um pequeno trecho da chamada:

  // 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 09/12/2008 em 20:53
fonte usuário
Em outras línguas...                            


5 respostas

votos
1

É, provavelmente, em seus manipuladores. Você deve colocar em lógica para manipular exceções lançadas pelos manipuladores de fluxo e você deve colocar em um mecanismo para garantir que os manipuladores de fluxo estão devidamente fechadas antes de chamar perto o processo. Problemas como este são difíceis de fixar para baixo por causa dos problemas de tempo com os manipuladores de eventos e o process.close assim que não me surpreender outros cartazes não ter sido capaz de reproduzi-lo. Mas eu já vi isso em ação. O problema é o EventHandler está ativo até que seja fechado chamando cancelErrorRead ou cancelOutputRead ou o processo será encerrado. Bem, se ele ainda está ocupado liberando uma certa saída a partir do final do processo, enquanto o segmento principal torna a Process.Close ... BOOM

Respondeu 10/12/2008 em 14:26
fonte usuário

votos
1

Se você anexar um depurador para o processo de bater, você vai saber exatamente por que ele caiu. Aqui está um tutorial detalhado sobre a depuração de acidentes: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

Respondeu 10/12/2008 em 05:11
fonte usuário

votos
1

Tente adicionar um flush após a tw.Write. Isso deve fazer com que a saída se completa ao ponto de não ser produzido, que pode incluir mensagens de erro do executável (se é isso que está falhando?)

Respondeu 09/12/2008 em 23:27
fonte usuário

votos
1

Qual é o acidente que você está recebendo? Uma exceção .net?

Que o arquivo não está escrito completamente poderia ser porque você não liberar o fluxo para o arquivo e, em seguida, fechá-lo.

Eu acho que poderia ser um problema que você use o mesmo fluxo tanto para a saída padrão e erro mensagens. Isso pode levar a problemas de concorrência.

Respondeu 09/12/2008 em 21:05
fonte usuário

votos
0

Eu testei seu código com um número de diferentes executáveis ​​e foi incapaz de fazê-lo funcionar da maneira que você descreve. Talvez seja um problema com o processo que você está executando?

Respondeu 09/12/2008 em 23:38
fonte usuário

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