Mengapa metode Keluar dari proses saya tidak dipanggil?


96

Saya memiliki kode berikut, tetapi mengapa ProcessExitedmetode ini tidak pernah dipanggil? Ini sama jika saya tidak menggunakan shell Windows ( 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
}

Jawaban:


241

Untuk menerima panggilan balik pada Exitedacara, EnableRaisingEventsharus disetel ke true.

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

3
koreksiProcess.WaitForExit (), tanpa fungsi ini kode ini tidak berfungsi untuk saya
Kira

7
Satu tip kecil (terutama untuk non ahli C #): jangan Close()prosesnya! Saya mengalami masalah intermiten dengan Exit handler karena upaya yang salah arah dalam pengelolaan sumber daya. Kode yang dimaksud dipanggil Process.Close()setelahnya Process.Start(startInfo), alih-alih mengizinkan GC untuk mengumpulkannya pada waktunya. Kesalahan mudah jika latar belakang Anda adalah bahasa non-GC (misalnya C / C ++).
Jerzy

3
Bagus. Terima kasih. Saya juga ingin berkomentar bahwa tugas EnableRaisingEventsdan EventHandlersharus dilakukan tepat setelah Process.Start(). Itu tidak akan berhasil jika tidak.
Doruk

2
@Doruk saya dapat mengatur EnableRaisingEvents=truesebelum menelepon Process.Start()dan berfungsi dengan baik.
Aksi Dan

29

Dari MSDN :

Acara Keluar menunjukkan bahwa proses terkait keluar. Kejadian ini berarti proses dihentikan (dibatalkan) atau berhasil ditutup. Peristiwa ini dapat terjadi hanya jika nilai properti EnableRaisingEvents benar.

Sudahkah Anda menyetel properti itu menjadi benar?


19
Ini adalah bendera yang sangat tidak khas juga (apa gunanya, jika saya tidak ingin acaranya, saya tidak berlangganan!)
Tamás Szelei

3
Tidak terlalu intuitif. Harus menyatakan dengan jelas di setiap deskripsi acara yang mengharuskan bendera ini disetel.
TheLegendaryCopyCoder

18

Anda harus menyetel Process.EnableRaisingEventske true.



10

Saya telah menemukan contoh tempat itu new Process()di usingklausa. Jangan lakukan itu jika Anda ingin menggunakan Exitedfitur tersebut. The usingklausul menghancurkan misalnya bersama dengan pegangan acara pada Exited.

Ini...

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

Haruskah ini ...

var process = new Process();

Saya telah memperhatikan itu juga. Anehnya, acara OutputDataReceived berfungsi dengan baik. Atau mungkin terjadi begitu cepat sehingga sebelum eksekusi di utas utama sampai ke Akhiri Penggunaan.
AlexVB
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.