Вызов с использованием процесса исполняемых авариями периодически

голоса
2

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

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

Я подозреваю, что причина этой аварии, потому что, как я пишу файл из.

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

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

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

  // 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);
          }
      }
  }
Задан 09/12/2008 в 20:53
источник пользователем
На других языках...                            


5 ответов

голоса
1

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

Ответил 10/12/2008 в 14:26
источник пользователем

голоса
1

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

Ответил 10/12/2008 в 05:11
источник пользователем

голоса
1

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

Ответил 09/12/2008 в 23:27
источник пользователем

голоса
1

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

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

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

Ответил 09/12/2008 в 21:05
источник пользователем

голоса
0

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

Ответил 09/12/2008 в 23:38
источник пользователем

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