Burada yeniden yönlendiriciye gönderilen örnek kodu ve yönlendirilen diğer programı çağıralım. Eğer o olsaydım, muhtemelen sorunu çoğaltmak için kullanılabilecek bir test yönlendirme programı yazardım.
Ben de yaptım. Test verileri için ECMA-334 C # Dil Spesifikasyonu v PDF'yi kullandım; yaklaşık 5MB. Aşağıdakiler bunun önemli bir parçası.
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;
}
Veri boyutu değeri gerçek dosya boyutuyla eşleşmiyor, ancak önemli değil. Bir PDF dosyasının satırların sonunda her zaman hem CR hem de LF kullanıp kullanmadığı açık değildir, ancak bunun önemi yoktur. Test etmek için başka herhangi bir büyük metin dosyası kullanabilirsiniz.
Büyük miktarda veri yazarken örnek yeniden yönlendirme kodunun askıda kaldığını, ancak küçük bir miktar yazdığımda kilitlenmediğini.
Bir şekilde bu kodun yürütülmesini izlemek için çok çalıştı ve yapamadım. Yeniden yönlendirilen program için ayrı bir konsol penceresi almaya çalışmak üzere bir konsol oluşturmayı devre dışı bırakan yeniden yönlendirilen programın satırlarını yorumladım ama yapamadım.
Sonra yeni bir pencerede, üst pencerenin penceresinde veya penceresiz bir konsol uygulaması nasıl başlatılır . Görünüşe göre, bir konsol programı ShellExecute olmadan başka bir konsol programı başlattığında (kolayca) ayrı bir konsola sahip olamayız ve ShellExecute yeniden yönlendirmeyi desteklemediğinden, diğer işlem için pencere belirtmesek bile bir konsolu paylaşmalıyız.
Yeniden yönlendirilen program bir yerde bir arabellek doldurursa, verilerin okunmasını beklemeli ve bu noktada yeniden yönlendirici tarafından hiçbir veri okunmuyorsa bir kilitlenme olduğunu varsayıyorum.
Çözüm, ReadToEnd kullanmamak ve veri yazılırken verileri okumaktır, ancak eşzamansız okumalar kullanmak gerekli değildir. Çözüm oldukça basit olabilir. Aşağıdakiler benim için 5 MB PDF ile çalışıyor.
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();
Başka bir olasılık, yeniden yönlendirme yapmak için bir GUI programı kullanmaktır. Yukarıdaki kod, belirgin değişiklikler haricinde bir WPF uygulamasında çalışır.