ฉันเป็นแอปพลิเคชั่นที่ทำ
Process.Start()
เพื่อเริ่มแอปพลิเคชันอื่น 'ABC' ฉันต้องการรอจนกระทั่งแอปพลิเคชันนั้นสิ้นสุดลง (กระบวนการตาย) และดำเนินการต่อไป ฉันจะทำมันได้อย่างไร
อาจมีแอปพลิเคชัน 'ABC' หลายอินสแตนซ์ทำงานอยู่ในเวลาเดียวกัน
ฉันเป็นแอปพลิเคชั่นที่ทำ
Process.Start()
เพื่อเริ่มแอปพลิเคชันอื่น 'ABC' ฉันต้องการรอจนกระทั่งแอปพลิเคชันนั้นสิ้นสุดลง (กระบวนการตาย) และดำเนินการต่อไป ฉันจะทำมันได้อย่างไร
อาจมีแอปพลิเคชัน 'ABC' หลายอินสแตนซ์ทำงานอยู่ในเวลาเดียวกัน
คำตอบ:
ฉันคิดว่าคุณแค่ต้องการสิ่งนี้:
var process = Process.Start(...);
process.WaitForExit();
ดูหน้า MSDNสำหรับวิธีการ นอกจากนี้ยังมีการโอเวอร์โหลดที่คุณสามารถระบุการหมดเวลาดังนั้นคุณอาจไม่รอตลอดไป
ใช้งานProcess.WaitForExit
หรือ หรือสมัครเป็นสมาชิกของProcess.Exited
กิจกรรมหากคุณไม่ต้องการที่จะปิดกั้น? หากไม่ได้ทำสิ่งที่คุณต้องการโปรดให้ข้อมูลเพิ่มเติมเกี่ยวกับความต้องการของคุณ
WaitForExit
ครั้งแรก ... ในบางกรณีคุณอาจต้องการรันโค้ดเพิ่มเติมเมื่อบางสิ่งเสร็จสิ้น แต่นั่นไม่ได้หมายความว่าคุณต้องปิดกั้นเธรดปัจจุบัน
Process.Exited
เหตุการณ์ฉันเชื่อว่าคุณต้องกำหนดค่ากระบวนการล่วงหน้าโดยการตั้งค่าProcess.EnableRaisingEvents
เป็นจริง แม้ว่าการพิจารณาว่าคำถามนี้มีอายุเกินสามปี แต่อาจเป็นไปได้ว่าProcess.EnableRaisingEvents
ไม่ใช่สิ่งที่เกิดขึ้นในช่วงเวลาที่ถูกถาม
Process.Exited
เหตุการณ์ ขอบคุณ! +1 เพื่อความสมบูรณ์
ฉันทำสิ่งต่อไปนี้ในใบสมัครของฉัน:
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.
มีคุณสมบัติพิเศษบางอย่างที่คุณอาจพบว่ามีประโยชน์ ...
คุณสามารถใช้รอการออกหรือคุณสามารถจับคุณสมบัติ HasExited และอัปเดต UI ของคุณเพื่อให้ผู้ใช้ "ทราบ" (การจัดการความคาดหวัง):
System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
//update UI
}
//done
ฉันมีกรณีที่Process.HasExited
ไม่เปลี่ยนแปลงหลังจากปิดหน้าต่างที่เป็นของกระบวนการ ดังนั้นProcess.WaitForExit()
ก็ไม่ได้ผล ฉันต้องตรวจสอบProcess.Responding
ว่าเป็นเท็จหลังจากปิดหน้าต่างดังนี้:
while (!_process.HasExited && _process.Responding) {
Thread.Sleep(100);
}
...
บางทีนี่อาจช่วยใครซักคน
Process.WaitForExitควรเป็นเพียงสิ่งที่คุณกำลังมองหาฉันคิดว่า
อ้างถึงตัวอย่างของ 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}");
}
เช่นเดียวกับ 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);
}
ลองสิ่งนี้:
string command = "...";
var process = Process.Start(command);
process.WaitForExit();