private static bool BreakEvent(int controlType) { if (controlType != 0 && controlType != 1) { return false; } ConsoleCancelEventHandler cancelCallbacks = Console._cancelCallbacks; if (cancelCallbacks == null) { return false; } ConsoleSpecialKey controlKey = (controlType == 0) ? ConsoleSpecialKey.ControlC : ConsoleSpecialKey.ControlBreak; Console.ControlCDelegateData controlCDelegateData = new Console.ControlCDelegateData(controlKey, cancelCallbacks); WaitCallback callBack = new WaitCallback(Console.ControlCDelegate); if (!ThreadPool.QueueUserWorkItem(callBack, controlCDelegateData)) { return false; } TimeSpan timeout = new TimeSpan(0, 0, 30); controlCDelegateData.CompletionEvent.WaitOne(timeout, false); if (!controlCDelegateData.DelegateStarted) { return false; } controlCDelegateData.CompletionEvent.WaitOne(); controlCDelegateData.CompletionEvent.Close(); return controlCDelegateData.Cancel; }