2014-02-09 23 views
0

我試着停止控制檯應用程序關閉,但關閉它完成所有功能之前..舉例站到90000,然後得到安慰關閉..我想它首先做的所有工作結束,然後關閉控制檯。對不起,我英語不好。C#塊控制檯應用程序緊密

例子:

private delegate bool EventHandler(CtrlType sig); 
    private enum CtrlType 
    { 
     CTRL_BREAK_EVENT = 1, 
     CTRL_C_EVENT = 0, 
     CTRL_CLOSE_EVENT = 2, 
     CTRL_LOGOFF_EVENT = 5, 
     CTRL_SHUTDOWN_EVENT = 6 
    } 
    private static EventHandler delegate0_0; 
    [DllImport("Kernel32")] 
    private static extern bool SetConsoleCtrlHandler(Program.EventHandler handler, bool add); 
    private const int MF_BYCOMMAND = 0x00000000; 
    public const int SC_CLOSE = 0xF060; 

    static void Main(string[] args) 
    { 
     Program.delegate0_0 = (Program.EventHandler)Delegate.Combine(Program.delegate0_0, new Program.EventHandler(Program.smethod_1)); 
     Program.SetConsoleCtrlHandler(Program.delegate0_0, true); 
     Console.ReadKey(true); 
    } 

    private static bool smethod_1(CtrlType enum0_0) 
    { 
     for (int i = 0; i < 10000000; i++) 
     { 
      Console.WriteLine(i); 
     } 

     return true; 
    } 
+0

這是不可能的。單擊「關閉」按鈕後,您有5秒鐘時間進行清理,就是這樣。在您的程序報告完成之前,理解它的理想方式是不要點擊關閉按鈕。 –

+0

好大壩.. :(我試試別的 – user3290224

+0

@HansPassant是可能的,如果您單擊鎖定X鍵可以觸發?實例它說:「請按Escape」 – user3290224

回答

1

在您的句柄上使用EventWaitHandle以等待它發出信號。 您使用非託管的句柄,所以這是一個相當於API來WIN32的WaitForSingleObject(HANDLE h, DWORD duaration();

所以這是C#代碼:

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset); 
handle.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(yourHandle,true); 
handle.WaitOne(); 

SafeWaitHandle創作這表明它應該終結一起清理true

0

您可以通過讓PROGRAMM停止它在你PROGRAMM結束等待用戶輸入:

Console.ReadLine(); 

Console.ReadKey(); 

原來的線程: How to stop C# console applications from closing automatically?

+0

如果你不看它那,你也許didint閱讀我的問題嗎? – user3290224

+1

公平地說,@ user3290224,你的問題一點也不清楚,很容易被誤解。請仔細閱讀更多細節,用文字表達你的代碼正在嘗試做什麼? –