मेरी प्रक्रिया की निकास विधि को क्यों नहीं कहा जा रहा है?


96

मेरे पास निम्नलिखित कोड है, लेकिन ProcessExitedविधि को कभी क्यों नहीं कहा जाता है? यह वही है अगर मैं विंडोज शेल ( startInfo.UseShellExecute = false) का उपयोग नहीं करता हूं ।

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);

try
{
     Process correctionProcess = Process.Start(startInfo);
     correctionProcess.Exited += new EventHandler(ProcessExited);                   

     correctionProcess.WaitForExit();

     status = true;
}

.....

internal void ProcessExited(object sender, System.EventArgs e)
{
      //print out here
}

जवाबों:


241

Exitedईवेंट पर कॉलबैक प्राप्त करने के लिए , EnableRaisingEventsइसे सही पर सेट किया जाना चाहिए।

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 

3
reformProcess.WaitForExit (), इस फ़ंक्शन के बिना यह कोड मेरे लिए काम नहीं कर रहा है
किरा

7
एक छोटी सी टिप (गैर सी # विशेषज्ञों के लिए जासूसी): Close()प्रक्रिया नहीं है! मुझे संसाधन प्रबंधन में एक गुमराह प्रयास के कारण एक्ज़िट हैंडलर के साथ आंतरायिक समस्या का सामना करना पड़ा है। जीसी को यथोचित पाठ्यक्रम में एकत्र करने की अनुमति देने के बजाए प्रश्न के Process.Close()बाद बुलाया गया कोड Process.Start(startInfo)। यदि आपकी पृष्ठभूमि गैर-जीसी भाषा है (जैसे C / C ++) तो आसान गलती।
जेरसी

3
महान। धन्यवाद। मैं यह भी कहना चाहता हूं कि इसके बाद काम करना चाहिए EnableRaisingEventsऔर EventHandlersठीक ही होना चाहिए Process.Start()। यह अन्यथा काम नहीं करेगा।
डोरुक

2
@ डोरुक मैं EnableRaisingEvents=trueकॉल करने से पहले सेट कर सकता हूं Process.Start()और यह ठीक काम करता है।
एक्शन डैन

29

से MSDN :

बाहर निकलने की घटना इंगित करती है कि संबंधित प्रक्रिया से बाहर निकल गया। इस घटना का अर्थ या तो यह है कि प्रक्रिया समाप्त (निरस्त) या सफलतापूर्वक बंद हो गई। यह घटना तभी हो सकती है जब EnableRaisingEvents प्रॉपर्टी की वैल्यू सही हो।

क्या आपने उस संपत्ति को सच कर दिया है?


19
यह एक बहुत ही अन-आइडोमैटिक झंडा है, भी (वैसे भी क्या फायदा, अगर मुझे इवेंट नहीं चाहिए, तो मैं इसे सब्सक्राइब नहीं करता!)
तमसे सजेले

3
बहुत सहज नहीं है। प्रत्येक घटना के विवरण में स्पष्ट रूप से बताना चाहिए कि इसे इस ध्वज को सेट करने की आवश्यकता है।
लेजेंडरीकॉपी कोडर



9

मैं new Process()एक usingक्लॉज में उस जगह के उदाहरणों पर आया हूं । यदि आप Exitedसुविधा का उपयोग करना चाहते हैं तो ऐसा न करें । usingखंड पर किसी भी घटना के हैंडल के साथ उदाहरण नष्ट कर देता है Exited

यह...

using(var process = new Process())
{
   // your logic here
}

यह होना चाहिए ...

var process = new Process();

मैंने उस पर भी गौर किया है। अजीब तरह से, OutputDataReceived घटनाओं ठीक काम करते हैं। या वे इतनी तेजी से घटित हो सकते हैं कि मुख्य थ्रेड में निष्पादन से पहले समाप्त हो जाते हैं।
एलेक्सवीबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.