2008-12-16 16 views
6

मैं एक निष्पादन योग्य है कि एक कमांड प्रॉम्प्ट से तुरन्त चलाता है, लेकिन जब System.Diagnostics.Process का उपयोग कर पैदा की कभी वापस जाने के लिए प्रकट नहीं होता है:नेट प्रसंस्करण स्पॉन मुद्दों

मूल रूप से, मैं एक नेट पुस्तकालय लिख रहा हूँ Accurev सीएलआई इंटरफ़ेस के चारों ओर रैपर, इसलिए प्रत्येक विधि कॉल एक कमांड निष्पादित करने के लिए सीएलआई प्रक्रिया spawns।

यह सभी के लिए अच्छा काम करता है, लेकिन एक आदेश:

accurev.exe show depots 

हालांकि, जब एक कंसोल से चल रहा है, यह ठीक चलता है, जब मैं एक .net प्रक्रिया का उपयोग कर इसे कहते हैं, यह लटकी हुई है ... प्रक्रिया स्पॉन कोड मैं का उपयोग करें:

public static string ExecuteCommand(string command) 
    { 

     Process p = createProcess(command); 

     p.Start();    
     p.WaitForExit(); 

     // Accurev writes to the error stream if ExitCode is non zero. 
     if (p.ExitCode != 0) 
     { 
      string error = p.StandardError.ReadToEnd(); 
      Log.Write(command + " failed..." + error); 
      throw new AccurevException(error);     
     } 
     else 
     { 
      return p.StandardOutput.ReadToEnd(); 
     } 

    } 

    /// Creates Accurev Process 
    /// </summary> 
    /// <param name="command"></param> 
    /// <returns></returns> 
    private static Process createProcess(string command) 
    { 
     Log.Write("Executing Command: " + command); 

     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     Process p = new Process(); 

     startInfo.CreateNoWindow = false; 
     startInfo.RedirectStandardOutput = true; 
     startInfo.RedirectStandardInput = true; 
     startInfo.RedirectStandardError = true; 

     startInfo.UseShellExecute = false; 
     startInfo.Arguments = command; 
     startInfo.FileName = _accurev; 

     p.StartInfo = startInfo; 

     return p; 
    } 

यह() p.WaitForExit में लटकी हुई है।

कोई सलाह?

संपादित करें: हल हो गया!

नेट प्रक्रिया के हैंग करता है, तो उत्पादन बफर अतिप्रवाह, मैं एक अतुल्यकालिक पढ़ने विधि का उपयोग करने के लिए बंद कर और सब कुछ काम करता है:

public static string ExecuteCommand(string command) 
    { 
     StringBuilder outputData = new StringBuilder(); 

     Process p = createProcess(command); 

     p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e) 
     { 
      outputData.AppendLine(e.Data); 
     }; 

     p.Start(); 
     p.BeginOutputReadLine(); 

     p.WaitForExit(); 

     // Accurev writes to the error stream if ExitCode is non zero. 
     if (p.ExitCode != 0) 
     { 
      string error = p.StandardError.ReadToEnd(); 
      Log.Write(command + " failed..." + error); 
      throw new AccurevException(error);     
     } 
     else 
     { 
      return outputData.ToString(); 
     } 

    } 
+0

आपको [इस पोस्ट] में रुचि हो सकती है (http://www.codeducky.org/process-handling-net/) जो काम करने की कुछ जटिलताओं पर चर्चा करता है इस तरह से .NET प्रक्रियाओं। – ChaseMedallion

उत्तर

1

जबकि WaitForExit() निष्पादित हो रहा है पैदा की प्रक्रिया अभी भी जीवित है? क्या आप इसे डीबगर संलग्न कर सकते हैं?

2

यह इनपुट की मांग कर रहा है? विशेष रूप से, मुझे लगता है कि आप stdin को रीडायरेक्ट कर रहे हैं, लेकिन इसे बंद नहीं कर रहे हैं - इसलिए यदि यह stdin से पढ़ रहा है तो यह लटका होगा।

+1

ठीक है, बंद करें - stdout बनाम stdin ;-p –

-2

कुछ इस तरह के साथ WaitForExit() की जगह की कोशिश:

while (!p.WaitForExit(100)) 
    Console.Write("."); 

दूसरी बात यह कोशिश करने के लिए सही पर UseShellExecute स्थापित कर रही है, और देख कंसोल विंडो पैदा की जा। इस पैरामीटर की जटिलताओं के लिए यह पृष्ठ देखें: http://blogs.msdn.com/jmstall/archive/2006/09/28/CreateNoWindow.aspx

+0

चूंकि पोस्टर इनपुट को रीडायरेक्ट कर रहा है, मुझे संदेह है कि यह काम करेगा। –

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