Mari kita sebut kode sampel yang diposting di sini pengalih dan program lain diarahkan. Jika itu saya maka saya mungkin akan menulis sebuah program tes diarahkan yang dapat digunakan untuk menduplikasi masalah.
Jadi saya lakukan. Untuk data uji saya menggunakan ECMA-334 C # Language Specificationv PDF; sekitar 5MB. Berikut ini adalah bagian penting dari itu.
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;
}
Nilai data tidak cocok dengan ukuran file aktual tetapi itu tidak masalah. Tidak jelas apakah file PDF selalu menggunakan CR dan LF di akhir baris tapi itu tidak masalah untuk ini. Anda dapat menggunakan file teks besar lainnya untuk mengujinya.
Menggunakan kode redirector sampel hang ketika saya menulis sejumlah besar data tetapi tidak ketika saya menulis sejumlah kecil.
Saya mencoba sangat banyak untuk entah bagaimana melacak eksekusi kode itu dan saya tidak bisa. Saya mengomentari garis-garis program yang diarahkan yang menonaktifkan pembuatan konsol untuk program yang diarahkan untuk mencoba mendapatkan jendela konsol yang terpisah tetapi saya tidak bisa.
Kemudian saya menemukan Cara memulai aplikasi konsol di jendela baru, jendela induk, atau tanpa jendela . Jadi ternyata kita tidak dapat (dengan mudah) memiliki konsol terpisah ketika satu program konsol memulai program konsol lain tanpa ShellExecute dan karena ShellExecute tidak mendukung pengalihan, kita harus berbagi konsol, bahkan jika kita tidak menentukan jendela untuk proses lainnya.
Saya berasumsi bahwa jika program diarahkan mengisi buffer di suatu tempat maka ia harus menunggu data untuk dibaca dan jika pada saat itu tidak ada data yang dibaca oleh redirector maka itu adalah jalan buntu.
Solusinya adalah tidak menggunakan ReadToEnd dan membaca data saat data sedang ditulis tetapi tidak perlu menggunakan bacaan asinkron. Solusinya bisa sangat sederhana. Berikut ini berfungsi untuk saya dengan PDF 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();
Kemungkinan lain adalah menggunakan program GUI untuk melakukan pengalihan. Kode sebelumnya berfungsi dalam aplikasi WPF kecuali dengan modifikasi yang jelas.