हमें यहां पर पोस्ट किए गए नमूना कोड को पुनर्निर्देशक और दूसरे कार्यक्रम को पुनर्निर्देशित कहते हैं। अगर यह मैं होता तो मैं शायद एक परीक्षण पुनर्निर्देशित कार्यक्रम लिखता, जिसका उपयोग समस्या की नकल करने के लिए किया जा सकता था।
तो मैंने किया। परीक्षण डेटा के लिए मैंने ECMA-334 C # भाषा विनिर्देश पीडीएफ का उपयोग किया; यह लगभग 5 एमबी है। निम्नलिखित उस का महत्वपूर्ण हिस्सा है।
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;
}
डेटा का मान वास्तविक फ़ाइल आकार से मेल नहीं खाता, लेकिन इससे कोई फर्क नहीं पड़ता। यह स्पष्ट नहीं है कि क्या एक पीडीएफ फाइल हमेशा लाइनों के अंत में सीआर और एलएफ दोनों का उपयोग करती है लेकिन इसके लिए कोई फर्क नहीं पड़ता। आप परीक्षण करने के लिए किसी अन्य बड़ी पाठ फ़ाइल का उपयोग कर सकते हैं।
सैंपल रिडायरेक्टर कोड का उपयोग करने पर जब मैं बड़ी मात्रा में डेटा लिखता हूं, लेकिन तब नहीं जब मैं छोटी राशि लिखता हूं।
मैंने किसी तरह उस कोड के निष्पादन का पता लगाने की बहुत कोशिश की और मैं नहीं कर सका। मैंने रीडायरेक्ट प्रोग्राम की तर्ज पर टिप्पणी की, जो रीडायरेक्ट प्रोग्राम के लिए कंसोल की अक्षम रचना को एक अलग कंसोल विंडो प्राप्त करने का प्रयास करने के लिए बनाया था, लेकिन मैं नहीं कर सका।
फिर मैंने पाया कि एक नई विंडो, पेरेंट की विंडो या कोई विंडो में कंसोल ऐप कैसे शुरू करें । जाहिर तौर पर जब हम एक कंसोल प्रोग्राम को शेलएक्सक्यूट के बिना एक और कंसोल प्रोग्राम शुरू करते हैं तो आसानी से एक अलग कंसोल नहीं हो सकता है और चूंकि शेलएक्सक्यूट्यूट पुनर्निर्देशन का समर्थन नहीं करता है, भले ही हम कंसोल को साझा करें, भले ही हम अन्य प्रक्रिया के लिए कोई विंडो निर्दिष्ट न करें।
मेरा मानना है कि यदि पुनर्निर्देशित कार्यक्रम कहीं बफर भरता है तो उसे डेटा के पढ़ने की प्रतीक्षा करनी चाहिए और यदि उस बिंदु पर रीडायरेक्टर द्वारा कोई डेटा नहीं पढ़ा जाता है तो यह एक गतिरोध है।
समाधान ReadToEnd का उपयोग नहीं करना है और डेटा को पढ़ने के दौरान डेटा लिखा जा रहा है, लेकिन अतुल्यकालिक रीड का उपयोग करना आवश्यक नहीं है। समाधान काफी सरल हो सकता है। निम्नलिखित मेरे लिए 5 एमबी पीडीएफ के साथ काम करता है।
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();
एक अन्य संभावना जीयूआई प्रोग्राम का उपयोग पुनर्निर्देशन करने के लिए है। पूर्ववर्ती कोड स्पष्ट संशोधनों को छोड़कर WPF आवेदन में काम करता है।