Я вызываю исполняемый файл в 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);
}
}
}