Vamos chamar o código de exemplo postado aqui como redirecionador e o outro programa como redirecionado. Se fosse eu, provavelmente escreveria um programa de teste redirecionado que pode ser usado para duplicar o problema.
Então eu fiz. Para dados de teste, usei o PDF de Especificação de Linguagem CMA ECMA-334; é cerca de 5MB. A seguir, é a parte importante disso.
StreamReader stream = null;
try { stream = new StreamReader(Path); }
catch (Exception ex)
{
Console.Error.WriteLine("Input open error: " + ex.Message);
return;
}
Console.SetIn(stream);
int datasize = 0;
try
{
string record = Console.ReadLine();
while (record != null)
{
datasize += record.Length + 2;
record = Console.ReadLine();
Console.WriteLine(record);
}
}
catch (Exception ex)
{
Console.Error.WriteLine($"Error: {ex.Message}");
return;
}
O valor do tamanho dos dados não corresponde ao tamanho real do arquivo, mas isso não importa. Não está claro se um arquivo PDF sempre usa CR e LF no final das linhas, mas isso não importa. Você pode usar qualquer outro arquivo de texto grande para testar.
Usando isso, o código de redirecionador de amostra trava quando eu escrevo a grande quantidade de dados, mas não quando eu escrevo uma pequena quantidade.
Tentei muito rastrear a execução desse código e não consegui. Comentei as linhas do programa redirecionado que desabilitaram a criação de um console para o programa redirecionado para tentar obter uma janela separada do console, mas não consegui.
Então eu encontrei Como iniciar um aplicativo de console em uma nova janela, na janela dos pais ou em nenhuma janela . Então, aparentemente, não podemos (facilmente) ter um console separado quando um programa de console inicia outro programa de console sem o ShellExecute e, como o ShellExecute não suporta redirecionamento, devemos compartilhar um console, mesmo se não especificarmos nenhuma janela para o outro processo.
Presumo que, se o programa redirecionado preenche um buffer em algum lugar, ele deve aguardar a leitura dos dados e, se nesse ponto, nenhum dado for lido pelo redirecionador, será um impasse.
A solução é não usar ReadToEnd e ler os dados enquanto os dados estão sendo gravados, mas não é necessário usar leituras assíncronas. A solução pode ser bastante simples. O seguinte funciona para mim com o PDF de 5 MB.
ProcessStartInfo info = new ProcessStartInfo(TheProgram);
info.CreateNoWindow = true;
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
Process p = Process.Start(info);
string record = p.StandardOutput.ReadLine();
while (record != null)
{
Console.WriteLine(record);
record = p.StandardOutput.ReadLine();
}
p.WaitForExit();
Outra possibilidade é usar um programa GUI para fazer o redirecionamento. O código anterior funciona em um aplicativo WPF, exceto com modificações óbvias.