İşlemimin Çıkış yöntemi neden çağrılmıyor?


96

Aşağıdaki kodum var ama ProcessExitedyöntem neden hiç çağrılmıyor? Windows kabuğu ( startInfo.UseShellExecute = false) kullanmazsam da aynıdır .

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
}

Yanıtlar:


243

ExitedOlayda bir geri arama almak için , EnableRaisingEventstrue olarak ayarlanmalıdır.

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

3
fixtionProcess.WaitForExit (), bu işlev olmadan bu kod benim için çalışmıyor
Kira

7
Küçük bir ipucu (özellikle C # uzmanları olmayanlar için): Close()İşlem yapmayın ! Kaynak yönetiminde yanlış yönlendirilmiş çaba nedeniyle Çıkış işleyicisinde ara sıra ortaya çıkan sorunla karşılaştım. GC'nin kodu zamanında toplamasına izin vermek yerine, söz konusu kod Process.Close()sonradan çağrılır Process.Start(startInfo). Arka planınız GC olmayan diller ise (örneğin C / C ++) hata.
Jerzy

3
Harika. Teşekkürler. Ben de o görevi vurgulamak istiyorum EnableRaisingEventsve EventHandlerssonra tam olarak yapılmalıdır Process.Start(). Aksi takdirde işe yaramayacak.
Doruk

2
@Doruk Aramadan EnableRaisingEvents=trueönce ayarlayabilirim Process.Start()ve iyi çalışıyor.
Action Dan

29

Gönderen MSDN :

Exited olayı, ilişkili işlemin çıktığını gösterir. Bu olay, işlemin sonlandırıldığı (iptal edildiği) veya başarıyla kapatıldığı anlamına gelir. Bu olay yalnızca EnableRaisingEvents özelliğinin değeri true olursa gerçekleşebilir.

Bu özelliği true olarak ayarladınız mı?


19
Bu aynı zamanda hiç de idomatik olmayan bir bayrak (ne işe yarıyor, eğer etkinliği istemiyorsam, ona abone değilim!)
Tamás Szelei

3
Pek sezgisel değil. Her olay açıklamasında bu bayrağın ayarlanmasını gerektirdiğini açıkça belirtmelidir.
TheLegendaryCopyCoder

18

Sen ayarlamalısınız Process.EnableRaisingEventsiçin true.



13

new Process()Bir usingcümlede yer alan örneklerle karşılaştım . ExitedÖzelliği kullanmak istiyorsanız bunu yapmayın . usingHükmü üzerinde herhangi bir olay kulpları ile birlikte örneği yok eder Exited.

Bu...

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

Bu olmalı ...

var process = new Process();

Bunu ben de fark ettim. Garip bir şekilde, OutputDataReceived olayları iyi çalışıyor. Ya da ana iş parçacığındaki yürütme Son Kullanım'a gelmeden önce çok hızlı gerçekleşiyor olabilirler.
AlexVB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.