एक प्रक्रिया समाप्त होने तक प्रतीक्षा करें


206

मैं एक आवेदन जो करता है

Process.Start()

एक और एप्लिकेशन 'एबीसी' शुरू करने के लिए। मैं तब तक इंतजार करना चाहता हूं जब तक कि आवेदन समाप्त नहीं हो जाता (प्रक्रिया मर जाती है) और मेरा निष्पादन जारी रहेगा। मैं यह कैसे कर सकता हूं?

एक ही समय में 'एबीसी' अनुप्रयोग के कई उदाहरण हो सकते हैं।


और यदि आप इसे एसिंक्रोनस रूप से करना चाहते हैं (यानी पूरा होने के बाद किसी घटना को बढ़ाते हैं), तो आप एसओ पर यहां देख सकते हैं
मैट

जवाबों:


401

मुझे लगता है कि आप बस यही चाहते हैं:

var process = Process.Start(...);
process.WaitForExit();

MSDN पृष्ठ देखेंविधि के लिए । इसमें एक अधिभार भी है जहां आप टाइमआउट निर्दिष्ट कर सकते हैं, इसलिए आप संभावित रूप से हमेशा इंतजार नहीं कर रहे हैं।


137

का उपयोग करें Process.WaitForExit? या Process.Exitedयदि आप ब्लॉक नहीं करना चाहते हैं तो घटना की सदस्यता लें ? यदि वह ऐसा नहीं करता है जो आप चाहते हैं, तो कृपया हमें अपनी आवश्यकताओं के बारे में अधिक जानकारी दें।


निश्चित रूप से प्रक्रिया के साथ अच्छी जानकारी। उत्साहित, लेकिन ओपी ने कहा "प्रतीक्षा करें"
माइक एम

8
@MikeM: यही वजह है कि मैंने WaitForExitपहली बार ... कुछ मामलों में आप कुछ खत्म होने पर अधिक कोड निष्पादित करना चाह सकते हैं, लेकिन इसका मतलब यह नहीं है कि आपको वर्तमान थ्रेड को ब्लॉक करने की आवश्यकता है।
जॉन स्कीट

7
यदि आप Process.Exitedईवेंट का उपयोग करने जा रहे हैं , तो मेरा मानना ​​है कि आपको प्रक्रिया Process.EnableRaisingEventsको सच में सेट करके पहले से कॉन्फ़िगर करना होगा । हालांकि, यह देखते हुए कि यह प्रश्न तीन साल से अधिक पुराना है, यह हो सकता है कि Process.EnableRaisingEventsयह उस समय की बात नहीं थी जब यह पूछा गया हो।
विल

मैं इस पृष्ठ पर Process.Exitedघटना के नाम की तलाश कर रहा हूं । धन्यवाद! पूर्णता के लिए +1
चाड

36

मैं अपने आवेदन में निम्नलिखित करता हूं:

Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.

वहाँ कुछ अतिरिक्त सुविधाएँ हैं जो आपको उपयोगी मिल सकती हैं ...


17

आप बाहर निकलने के लिए प्रतीक्षा का उपयोग कर सकते हैं या आप HasExited संपत्ति को पकड़ सकते हैं और उपयोगकर्ता को "सूचित" (उम्मीद प्रबंधन) रखने के लिए अपने UI को अपडेट कर सकते हैं:

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done

9

मेरे पास एक मामला Process.HasExitedथा जहां प्रक्रिया से संबंधित विंडो को बंद करने के बाद नहीं बदला। इसलिए Process.WaitForExit()भी काम नहीं किया। मुझे यह देखना था Process.Respondingकि खिड़की को बंद करने के बाद वह किस तरह झूठे हो गए:

while (!_process.HasExited && _process.Responding) {
  Thread.Sleep(100);
}
...

शायद यह किसी की मदद करता है।



1

Microsoft उदाहरण का जिक्र: [ https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

सबसे अच्छा सेट करना होगा:

myProcess.EnableRaisingEvents = true;

कोड को अवरुद्ध किया जाएगा। इसके अलावा कोई अतिरिक्त गुण की जरूरत नहीं है।

// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
                  $"Exit time    : {myProcess.ExitTime}\n" +
                  $"Exit code    : {myProcess.ExitCode}\n" +
                  $"Elapsed time : {elapsedTime}");
}

0

जैसे जॉन स्कीट कहते हैं, का उपयोग करें Process.Exited:

proc.StartInfo.FileName = exportPath + @"\" + fileExe;
proc.Exited += new EventHandler(myProcess_Exited);
proc.Start();
inProcess = true;

while (inProcess)
{
    proc.Refresh();
    System.Threading.Thread.Sleep(10);
    if (proc.HasExited)
    {
        inProcess = false;
    }
}

private void myProcess_Exited(object sender, System.EventArgs e)
{
    inProcess = false;
    Console.WriteLine("Exit time:    {0}\r\n" +
      "Exit code:    {1}\r\n", proc.ExitTime, proc.ExitCode);
}

वास्तव में इस सवाल का जवाब नहीं है। कृपया प्रश्न को हल करने के लिए अपने उत्तर को परिष्कृत करें
धीरे से

और अब? शायद vb खोलें और समाधान करें;)
डेविड लोप्स

-5

इसे इस्तेमाल करे:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();

5
प्रश्न के बारे में पहले से ही उत्तर दिए गए प्रश्न के उत्तर पर टिप्पणी करने वाली बात क्या है? न केवल आपने अपने स्वयं के चक्रों को बर्बाद किया है, बल्कि आपने मुझे भी बर्बाद करने के लिए मजबूर किया है।
जेमी इवानोव

@AdamBilinski सवाल और जवाब अन्य लोगों द्वारा देखे जाने का इरादा है, जो सवाल ही नहीं है, जिसने पूछा
L3n

4
@ L3n मैं सहमत हूं, लेकिन यह उत्तर बिल्कुल स्वीकार किए गए उत्तर के समान है, इसलिए यह व्यर्थ है!
एडम बिलिंस्की

@AdamBilinski ओह, आपकी टिप्पणी को ठीक से नहीं पढ़ा, मुझे माफ कर दो xD
L3n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.