รอจนกว่ากระบวนการจะจบ


206

ฉันเป็นแอปพลิเคชั่นที่ทำ

Process.Start()

เพื่อเริ่มแอปพลิเคชันอื่น 'ABC' ฉันต้องการรอจนกระทั่งแอปพลิเคชันนั้นสิ้นสุดลง (กระบวนการตาย) และดำเนินการต่อไป ฉันจะทำมันได้อย่างไร

อาจมีแอปพลิเคชัน 'ABC' หลายอินสแตนซ์ทำงานอยู่ในเวลาเดียวกัน


และถ้าคุณต้องการที่จะทำแบบไม่พร้อมกัน (เช่นเพิ่มเหตุการณ์หลังจากเสร็จสิ้น) คุณสามารถดูที่นี่ที่ SO
Matt

คำตอบ:


401

ฉันคิดว่าคุณแค่ต้องการสิ่งนี้:

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

ดูหน้า MSDNสำหรับวิธีการ นอกจากนี้ยังมีการโอเวอร์โหลดที่คุณสามารถระบุการหมดเวลาดังนั้นคุณอาจไม่รอตลอดไป


137

ใช้งานProcess.WaitForExitหรือ หรือสมัครเป็นสมาชิกของProcess.Exitedกิจกรรมหากคุณไม่ต้องการที่จะปิดกั้น? หากไม่ได้ทำสิ่งที่คุณต้องการโปรดให้ข้อมูลเพิ่มเติมเกี่ยวกับความต้องการของคุณ


ข้อมูลที่ดีอย่างแน่นอนกับ Process.Exited แต่ OP บอกว่า "รอ"
Mike M

8
@MikeM: ซึ่งเป็นสาเหตุที่ฉันอ้างถึงWaitForExitครั้งแรก ... ในบางกรณีคุณอาจต้องการรันโค้ดเพิ่มเติมเมื่อบางสิ่งเสร็จสิ้น แต่นั่นไม่ได้หมายความว่าคุณต้องปิดกั้นเธรดปัจจุบัน
Jon Skeet

7
หากคุณจะใช้Process.Exitedเหตุการณ์ฉันเชื่อว่าคุณต้องกำหนดค่ากระบวนการล่วงหน้าโดยการตั้งค่าProcess.EnableRaisingEventsเป็นจริง แม้ว่าการพิจารณาว่าคำถามนี้มีอายุเกินสามปี แต่อาจเป็นไปได้ว่าProcess.EnableRaisingEventsไม่ใช่สิ่งที่เกิดขึ้นในช่วงเวลาที่ถูกถาม
จะ

ฉันปิดท้ายหน้านี้เพื่อค้นหาชื่อของProcess.Exitedเหตุการณ์ ขอบคุณ! +1 เพื่อความสมบูรณ์
Chad

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

เช่นเดียวกับ Jon Skeet พูดว่าใช้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);
}

ไม่ตอบคำถามจริงๆ โปรดปรับแต่งคำตอบของคุณเพื่อแก้คำถาม
Grantly

และตอนนี้? อาจจะเปิด vb และแก้ปัญหา;)
David Lopes

-5

ลองสิ่งนี้:

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

5
ประเด็นที่แสดงความคิดเห็นเกี่ยวกับคำตอบของคำถามที่ตอบแล้วเกี่ยวกับคำถามที่ได้รับคำตอบแล้วคืออะไร ไม่เพียง แต่คุณจะได้สูญเสียวงจรของคุณเอง แต่คุณยังบังคับให้ฉันต้องเสียของฉันด้วย
เจมี่อิวานอฟ

@AdamBilinski คำถามและคำตอบมีวัตถุประสงค์เพื่อให้คนอื่นเห็นที่มีคำถามไม่เพียง แต่คนที่ถาม
L3n

4
@ L3n ฉันเห็นด้วย แต่คำตอบนี้ตรงกับคำตอบที่ยอมรับดังนั้นมันจึงไม่มีจุดหมาย!
Adam Bilinski

@AdamBilinski โอ้ใช่แล้วไม่ได้อ่านความคิดเห็นของคุณอย่างถูกต้องให้อภัยฉัน xD
L3n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.