2013-04-15 20 views
7

Jestem bardzo nowy w języku C#, więc moje pytanie może zabrzmieć głupio. Zajmuję się tworzeniem aplikacji, która czasami wymaga uruchomienia ffmpeg. Jak zgadujesz, ten proces ffmpeg musi zostać zabity, gdy zamknięta jest aplikacja hosta. Używam takiego kodu dla tego zadania:C#: proces zamykania procesu "zabijanie procesu" (z zadaniem)

AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); 
private void OnProcessExit(object sender, EventArgs e) 
    { 
     proc.Kill(); 
    } 

Działa to dobrze, gdy aplikacja jest prawidłowo zamknięta (przez to interfejs lub TaskMan - Aplikacje). Problem polega na tym, że zdarzenie OnProcessExit nie zostanie wywołane, jeśli proces programu został zabity (za pomocą Taskman - Processes). O ile mi wiadomo, proces zabijania i zamykania akcji programu nie jest taki sam na niskim poziomie, ale myślę, że proces zabijania jest poleceniem i może być obsługiwany za pomocą narzędzi C#. Czy możliwe jest zamknięcie procesu potomnego w tym przypadku?

+3

[Pytanie] (http://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed?rq=1) mówi o zabijanie procesy podrzędne, gdy ich rodzic jest zabity. –

+0

Dzięki, Scott Miller, [this] [1] metoda jest wszystko, czego potrzebuję, aby rozwiązać mój problem. [1]: http://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed?rq=1 – JustLogin

+3

Nie, to zły pomysł. Próba zrobienia czegoś rozsądnego, gdy użytkownik robi coś nierozsądnego, to po prostu zmarnowany wysiłek. Nie masz pojęcia * dlaczego * użytkownik zdecydował się zabić twój program w ten sposób. Ale zazwyczaj zakładasz, że to nie dlatego, że twój program działa poprawnie. Szanse, że cokolwiek zamierzasz zrobić, by zabić ffmpeg, osiągną dobry cel, są odpowiednio szczupłe. Obiekty Job też nie są rozwiązaniem, bardzo źle się zepsuły w Vista. Teraz masz dwa problemy. –

Odpowiedz

1

myślę Spróbuj

Application.Exit(); 
0

polecam używać przedmiotów pracy (zgodnie z sugestią Scott Miller). Inną opcją może być mieć specjalną aplikację pomocniczą dla swojej aplikacji, która ma następujący:

  • Uruchom aplikację
  • Kiedy aplikacja rozbił, posprzątać po nim.

Ale obiektów praca jest zdecydowanie lepszym rozwiązaniem, jest wykonany specjalnie dla tej

0

niech program gospodarz przedstawić swój program ID jako parametr, a następnie słuchać jeśli wyjść programowych.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      if (args.Length != 0) 
       new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(handelexit)).Start(args[0]); 

      // your code here 
     } 

     static void handelexit(object data) 
     { 
      int id = System.Convert.ToInt32(data.ToString()); 

      System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(id); 
      while (!p.HasExited) 
       System.Threading.Thread.Sleep(100); 

      System.Environment.Exit(0); 
     } 
    } 
} 
Powiązane problemy