2013-11-03 33 views
2

我有一個運行幾個外部流程這樣在控制檯應用程序捕獲Ctrl + C事件(多線程)

private static MyExternalProcess p1; 
    private static MyExternalProcess p2; 
    private static MyExternalProcess p3; 

    public void Main() { 
     p1 = new MyExternalProcess(); 
     p2 = new MyExternalProcess(); 
     p3 = new MyExternalProcess(); 

     p1.startProcess(); 
     p2.startProcess(); 
     p3.startProcess(); 
    } 

    public static void killEveryoneOnExit() { 
     p1.kill(); 
     p2.kill(); 
     p3.kill(); 
    } 


    class MyExternalProcess { 
     private Process p; 
     ... 
     public void startProces() { 
      // do some stuff 
      PlayerProcess = new Process(); 
      .... 
      PlayerProcess.Start(); 
      // do some stuff 
     } 

     public void kill() { 
      // do some stuff 
      p.Kill(); 
     } 
    }   

,我需要做的是一個控制檯應用程序的主線程:當主線程被中斷(退出按鈕或ctrl + c)時,其他進程應該被終止。 如何在CTRL + C或Exit(X)按鈕上觸發我的方法killEveryoneOnExit?

+1

重複:請查看http://stackoverflow.com/questions/3342941/kill-child-process-when-parent-process-is-killed瞭解設置子進程的正確方法或http:// stackoverflow.com/questions/177856/how-do-i-trap-ctrl-c-in-ac-sharp-console-app如果你想自己處理Ctrl-C。 –

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

5

根據您的問題,您需要捕捉兩個事件。

如果你把這兩個在一起,你的榜樣你得到的東西是這樣的:

static ConsoleEventDelegate handler; 
private delegate bool ConsoleEventDelegate(int eventType); 
[DllImport("kernel32.dll", SetLastError = true)] 
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add); 

private static MyExternalProcess p1; 

public static void Main() 
{ 
    Console.CancelKeyPress += delegate 
    { 
     killEveryoneOnExit(); 
    }; 

    handler = new ConsoleEventDelegate(ConsoleEventCallback); 
    SetConsoleCtrlHandler(handler, true); 

    p1 = new MyExternalProcess(); 
    p1.startProcess(); 
} 

public static void killEveryoneOnExit() 
{ 
    p1.kill(); 
} 

static bool ConsoleEventCallback(int eventType) 
{ 
    if (eventType == 2) 
    { 
     killEveryoneOnExit(); 
    } 
    return false; 
} 

對於工作CTRL C(好玩意)貼例如:http://pastebin.com/6VV4JKPY

相關問題