Hãy để chúng tôi gọi mã mẫu được đăng ở đây là bộ chuyển hướng và chương trình khác được chuyển hướng. Nếu là tôi thì có lẽ tôi sẽ viết một chương trình chuyển hướng thử nghiệm có thể được sử dụng để nhân đôi vấn đề.
Tôi cũng vậy. Đối với dữ liệu thử nghiệm, tôi đã sử dụng ECMA-334 C # Language Đặc tả PDF; đó là khoảng 5 MB. Sau đây là phần quan trọng của điều đó.
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;
}
Giá trị dữ liệu hóa không khớp với kích thước tệp thực tế nhưng điều đó không quan trọng. Không rõ liệu một tệp PDF luôn sử dụng cả CR và LF ở cuối dòng hay không nhưng điều đó không quan trọng đối với điều này. Bạn có thể sử dụng bất kỳ tệp văn bản lớn khác để kiểm tra.
Sử dụng mã chuyển hướng mẫu bị treo khi tôi ghi lượng dữ liệu lớn nhưng không phải khi tôi viết một lượng nhỏ.
Tôi đã cố gắng rất nhiều để bằng cách nào đó theo dõi việc thực thi mã đó và tôi không thể. Tôi đã nhận xét các dòng của chương trình được chuyển hướng đã vô hiệu hóa việc tạo giao diện điều khiển cho chương trình được chuyển hướng để cố gắng có được một cửa sổ giao diện điều khiển riêng nhưng tôi không thể.
Sau đó, tôi tìm thấy Cách khởi động ứng dụng bảng điều khiển trong một cửa sổ mới, cửa sổ của cha mẹ hoặc không có cửa sổ . Vì vậy, rõ ràng chúng ta không thể (dễ dàng) có một bàn điều khiển riêng khi một chương trình bàn điều khiển khởi động một chương trình bàn điều khiển khác mà không có ShellExecute và vì ShellExecute không hỗ trợ chuyển hướng, chúng ta phải chia sẻ một bàn điều khiển, ngay cả khi chúng ta chỉ định không có cửa sổ cho quy trình khác.
Tôi giả sử rằng nếu chương trình được chuyển hướng lấp đầy bộ đệm ở đâu đó thì nó phải chờ dữ liệu được đọc và nếu tại thời điểm đó không có dữ liệu nào được đọc bởi bộ chuyển hướng thì đó là một bế tắc.
Giải pháp là không sử dụng ReadToEnd và đọc dữ liệu trong khi dữ liệu đang được ghi nhưng không cần thiết phải sử dụng đọc không đồng bộ. Giải pháp có thể khá đơn giản. Các công việc sau đây đối với tôi với 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();
Một khả năng khác là sử dụng chương trình GUI để thực hiện chuyển hướng. Mã trước hoạt động trong một ứng dụng WPF trừ khi có sửa đổi rõ ràng.