.NET

2008-10-02 5 views
8

में मानक आउटपुट को कुशलता से रीडायरेक्ट करें। मैं एक .NET प्रोग्राम से php-cgi.exe को कॉल करने का प्रयास कर रहा हूं। मैं आउटपुट को स्ट्रीम के रूप में वापस पाने के लिए RedirectStandardOutput का उपयोग करता हूं लेकिन पूरी चीज बहुत धीमी है।.NET

क्या आपको कोई विचार है कि मैं इसे तेज़ी से कैसे बना सकता हूं? कोई अन्य तकनीक?

Dim oCGI As ProcessStartInfo = New ProcessStartInfo() 
    oCGI.WorkingDirectory = "C:\Program Files\Application\php" 
    oCGI.FileName = "php-cgi.exe" 
    oCGI.RedirectStandardOutput = True 
    oCGI.RedirectStandardInput = True 
    oCGI.UseShellExecute = False 
    oCGI.CreateNoWindow = True 

    Dim oProcess As Process = New Process() 

    oProcess.StartInfo = oCGI 
    oProcess.Start() 

    oProcess.StandardOutput.ReadToEnd() 
+0

आप [इस पोस्ट] में रुचि हो सकती (http://www.codeducky.org/process-handling-net) है, जो नेट प्रक्रिया धाराओं के साथ काम करने की जटिलताओं के कई शामिल हैं। यह [MedallionShell] (https://github.com/madelson/MedallionShell) लाइब्रेरी की सिफारिश करता है, जो इस प्रकार के कार्य को काफी सरल बनाता है, और – ChaseMedallion

उत्तर

7

आप OutputDataReceived event का उपयोग के रूप में यह stdout के लिए पंप है डेटा प्राप्त कर सकते हैं।

+0

को अवरुद्ध करने से रोकने के लिए एसिंक का उपयोग कर सकता है बस एक साइड नोट, मैं आउटपुटडेटा के साथ मानक त्रुटि को रीडायरेक्ट कर दूंगा घटना भी। फिर आप एक नया अपवाद फेंक सकते हैं या किसी अन्य तरीके से त्रुटि को संभाल सकते हैं। –

+0

उत्कृष्ट प्वाइंट! –

+8

@ विन्सेंट @ बॉब किंग इस घटना के साथ समस्या यह है कि इसे केवल तब कहा जाता है जब आउटपुट को एक नई लाइन प्राप्त होती है। इस धागे में एक और जवाब में मेरा समाधान तब भी काम करता है जब आउटपुट में कैरिज रिटर्न नहीं होता है और न ही न्यूलाइन होती है। –

15

सबसे अच्छा समाधान मैंने पाया है:

private void Redirect(StreamReader input, TextBox output) 
{ 
    new Thread(a => 
    { 
     var buffer = new char[1]; 
     while (input.Read(buffer, 0, 1) > 0) 
     { 
      output.Dispatcher.Invoke(new Action(delegate 
      { 
       output.Text += new string(buffer); 
      })); 
     }; 
    }).Start(); 
} 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    process = new Process 
    { 
     StartInfo = new ProcessStartInfo 
     { 
      CreateNoWindow = true, 
      FileName = "php-cgi.exe", 
      RedirectStandardOutput = true, 
      UseShellExecute = false, 
      WorkingDirectory = @"C:\Program Files\Application\php", 
     } 
    }; 
    if (process.Start()) 
    { 
     Redirect(process.StandardOutput, textBox1); 
    } 
} 
+0

आप सही हैं, यह समाधान पुनर्विक्रेता है लेकिन जब तक आप –

+0

पर टिप्पणी में वर्णित समस्या से गुजरते हैं, तब तक यह स्पष्ट नहीं है जब तक आप आउटपुट को फोर्क या टी नहीं कर सकते हैं, इसलिए यह खोल निष्पादित हो जाता है और आपकी प्रक्रिया उसी पर होती है पहर? http://stackoverflow.com/questions/9525171/can-i-fork-the-output-streams-of-a-process-im-starting/9525264#comment12080971_9525264 – Maslow

+2

यह सचमुच सबसे अच्छा समाधान है जिसे मैंने कभी भी पुनर्निर्देशित करने के लिए देखा है आउटपुट ... धन्यवाद जेडर! – slashp

2

समस्या की वजह से एक बुरा php.ini config है। मुझे एक ही समस्या थी और मैंने विंडोज इंस्टालर को डाउनलोड किया: http://windows.php.net/download/

उसके बाद और आवश्यक एक्सटेंशन की टिप्पणी करने पर, रूपांतरण प्रक्रिया अलाया शीघ्र गोन्ज़लेस है, जो प्रति सेकंड 20 php परिवर्तित करती है।

आप सुरक्षित रूप से "oProcess.StandardOutput.ReadToEnd()" का उपयोग कर सकते हैं। यह धागा समाधान का उपयोग करने के रूप में तेजी से और अधिक पढ़ने योग्य है। एक स्ट्रिंग के साथ संयोजन में थ्रेड समाधान का उपयोग करने के लिए आपको किसी ईवेंट या कुछ को पेश करने की आवश्यकता है।

चीयर्स

संबंधित मुद्दे

 संबंधित मुद्दे