เหตุใดเมธอด Exited ของกระบวนการของฉันจึงไม่ถูกเรียกใช้


96

ฉันมีรหัสต่อไปนี้ แต่เหตุใดจึงProcessExitedไม่เรียกเมธอดนี้ เหมือนกันถ้าฉันไม่ใช้ Windows shell ( 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
}

คำตอบ:


243

ในการรับการติดต่อกลับในExitedเหตุการณ์EnableRaisingEventsต้องตั้งค่าเป็นจริง

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

3
CorrectionProcess.WaitForExit () หากไม่มีฟังก์ชันนี้รหัสนี้ใช้ไม่ได้สำหรับฉัน
Kira

7
เคล็ดลับเล็ก ๆ อย่างหนึ่ง (โดยเฉพาะสำหรับผู้เชี่ยวชาญที่ไม่ใช่ C #): อย่าทำClose()! ฉันพบปัญหาไม่ต่อเนื่องกับตัวจัดการการออกเนื่องจากความพยายามในการจัดการทรัพยากรที่เข้าใจผิด รหัสที่เป็นปัญหาถูกเรียกProcess.Close()ตามหลังProcess.Start(startInfo)แทนที่จะปล่อยให้ GC รวบรวมในเวลาที่กำหนด เกิดข้อผิดพลาดได้ง่ายหากพื้นหลังของคุณไม่ใช่ภาษา GC (เช่น C / C ++)
Jerzy

3
เยี่ยมมาก ขอบคุณ. ฉันต้องการที่จะตั้งข้อสังเกตว่าการมอบหมายEnableRaisingEventsและEventHandlersต้องทำหลังจากProcess.Start(). มันจะไม่ทำงานอย่างอื่น
Doruk

2
@Doruk ฉันสามารถตั้งค่าEnableRaisingEvents=trueก่อนที่จะโทรProcess.Start()และทำงานได้ดี
Action Dan

29

จากMSDN :

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

คุณตั้งค่าคุณสมบัตินั้นเป็นจริงหรือไม่?


19
มันเป็นแฟล็กที่ไม่ได้ใช้งานมากเช่นกัน (จะใช้อะไรต่อไปถ้าฉันไม่ต้องการกิจกรรมฉันไม่สมัคร!)
Tamás Szelei

3
ไม่ค่อยเข้าใจง่าย ควรระบุอย่างชัดเจนในแต่ละคำอธิบายเหตุการณ์ว่าต้องตั้งค่าสถานะนี้
TheLegendaryCopyCoder



13

ฉันเจอตัวอย่างที่new Process()อยู่ในusingประโยค อย่าทำเช่นนั้นหากคุณต้องการใช้Exitedคุณลักษณะนี้ ข้อทำลายตัวอย่างพร้อมกับจับเหตุการณ์ใดusingExited

นี้...

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

น่าจะประมาณนี้ ...

var process = new Process();

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