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
}
5YrsLaterDBA
sumber

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); 
Elisa
sumber
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?

CodingGorilla
sumber
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.

Sam B
sumber
13

Setel koreksiProcess.EnableRaisingEvents = true

Gary L Cox Jr
sumber
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();
Adam Cox
sumber
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