Вызов исполняемого файла с использованием процесса прерывается с перебоями - PullRequest
2 голосов
/ 09 декабря 2008

Я вызываю исполняемый файл в C #. Когда исполняемый файл запускается, он записывает данные в консоль, поэтому код C # получает выходные данные консоли и записывает их в текстовый файл. Когда происходит сбой, происходит пара вещей.

1) Вывод текстового файла не полностью записан. 2) Кажется, что исполняемый процесс полностью выполнен, потому что он генерирует отчет так же, как и успешный запуск.

Я подозреваю, что причина этого сбоя в том, как я записываю файл.

Обновление: - Что касается сбоя, появляется диалоговое окно, в котором говорится, что «Менеджер столкнулся с проблемой и должен быть закрыт. Приносим извинения за неудобства». Тогда у него есть кнопка ОК. Когда вы нажимаете кнопку ОК, у меня появляется диалоговое окно, которое спрашивает, хочу ли я снова запустить менеджер.

  • Приложение менеджера, которое вызывает исполняемый файл, является однопоточным. Исполняемый файл может работать многопоточным.

Вот небольшой фрагмент звонка:

  // 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);
          }
      }
  }

Ответы [ 5 ]

1 голос
/ 10 декабря 2008

Это, вероятно, в ваших обработчиках. Вы должны включить логику для обработки исключений, выдаваемых обработчиками потоков, и вы должны включить механизм, обеспечивающий правильное закрытие обработчиков потоков, прежде чем вызывать метод close. Подобные проблемы трудно определить из-за проблем синхронизации с обработчиками событий и process.close, поэтому меня не удивляет то, что другие авторы не смогли воспроизвести его. Но я видел это в действии. Проблема заключается в том, что EventHandler активен до тех пор, пока он не будет закрыт с помощью вызова cancelErrorRead или cancelOutputRead, или пока процесс не завершится. Хорошо, если он все еще занят сбросом некоторого вывода с самого конца процесса, в то время как основной поток переходит в Process.Close ... BOOM

1 голос
/ 10 декабря 2008

Если вы подключите отладчик к процессу сбоя, вы будете точно знать, почему он вышел из строя. Вот подробное руководство по отладке сбоев: http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx

1 голос
/ 10 декабря 2008

Попробуйте добавить флеш после tw.Write. Это должно привести к тому, что будет получен полный вывод до момента сбоя, который может включать сообщения об ошибках из исполняемого файла (если это то, что вызывает сбой?)

1 голос
/ 09 декабря 2008

Какую аварию вы получаете? Исключение .Net?

Возможно, файл записан не полностью, потому что вы не сбрасываете поток в файл, а затем закрываете его.

Я думаю, что может быть проблема в том, что вы используете один и тот же поток как для стандартных сообщений, так и для сообщений об ошибках. Это может привести к проблемам с параллелизмом.

0 голосов
/ 10 декабря 2008

Я протестировал ваш код с несколькими различными исполняемыми файлами и не смог заставить его выйти из строя так, как вы описали. Может быть, это проблема процесса, который вы выполняете?

...