2008-09-15 15 views
18

मैं .NET Framework 3.5मुझे कैसे पता चलेगा कि आखिरी आउटपुटडेटा प्राप्त हुआ कब?

मैं दोनों StandardOutput और StandardError पाइप निर्देशित कर दिये है और मैं अतुल्यकालिक रूप से उन लोगों से डेटा प्राप्त कर रहा हूँ पर लक्षित एक कार्यक्रम में एक System.Diagnostics.Process वस्तु है। मैंने एक्स्टिट इवेंट के लिए इवेंट हैंडलर भी सेट किया है।

एक बार जब मैं Process.Start() पर कॉल करता हूं तो मैं बाहर जाना चाहता हूं और अन्य काम करता हूं जबकि मैं घटनाओं को उठाने की प्रतीक्षा करता हूं।

दुर्भाग्यवश ऐसा लगता है कि, एक ऐसी प्रक्रिया के लिए जो बड़ी मात्रा में जानकारी देता है, मौजूदा घटना को अंतिम OutputDataReceived ईवेंट से पहले निकाल दिया जाता है।

मुझे कैसे पता चलेगा कि अंतिम OutputDataReceived कब प्राप्त हुआ है? आदर्श रूप में मुझे Exited ईवेंट प्राप्त होगा जो मुझे प्राप्त होने वाली आखिरी घटना होगी।

यहाँ एक उदाहरण कार्यक्रम है:

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

    static void Main(string[] args) 
    { 
     string command = "output.exe"; 
     string arguments = " whatever"; 

     ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

     // Redirect the standard output of the process. 
     info.RedirectStandardOutput = true; 
     info.RedirectStandardError = true; 

     // Set UseShellExecute to false for redirection 
     info.UseShellExecute = false; 

     Process proc = new Process(); 
     proc.StartInfo = info; 
     proc.EnableRaisingEvents = true; 

     // Set our event handler to asynchronously read the sort output. 
     proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
     proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
     proc.Exited += new EventHandler(proc_Exited); 

     proc.Start(); 
     // Start the asynchronous read of the sort output stream. Note this line! 
     proc.BeginOutputReadLine(); 
     proc.BeginErrorReadLine(); 

     proc.WaitForExit(); 

     Console.WriteLine("Exited (Main)"); 

    } 

    static void proc_Exited(object sender, EventArgs e) 
    { 

     Console.WriteLine("Exited (Event)"); 
    } 



    static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Console.WriteLine("Error: {0}", e.Data); 
    } 



    static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Console.WriteLine("Output data: {0}", e.Data); 
    } 


    } 
} 

जब इस कार्यक्रम आप देखेंगे कि "से बाहर निकल गया (घटना)" उत्पादन के भीतर एक पूरी तरह से चर स्थान में प्रकट होता है चल रहा है। आपको इसे कुछ बार चलाने की आवश्यकता हो सकती है और जाहिर है, आपको अपनी पसंद के एक कार्यक्रम के साथ "output.exe" को प्रतिस्थापित करने की आवश्यकता होगी जो उत्पादन की उचित मात्रा में उत्पादन करे।

तो, प्रश्न फिर से: मुझे कैसे पता चलेगा कि अंतिम OutputDataReceived कब प्राप्त हुआ है? आदर्श रूप में मुझे Exited ईवेंट प्राप्त होगा जो मुझे प्राप्त होने वाली आखिरी घटना होगी।

उत्तर

23

इस का जवाब है कि e.Data will be set to null:

static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    if(e.Data == null) _exited.Set(); 
} 
संबंधित मुद्दे