考虑一个Console应用程序,它在一个单独的线程中启动一些服务.它需要做的就是等待用户按Ctrl + C将其关闭.
以下哪项是更好的方法?
static ManualResetEvent _quitEvent = new ManualResetEvent(false); static void Main() { Console.CancelKeyPress += (sender, eArgs) => { _quitEvent.Set(); eArgs.Cancel = true; }; // kick off asynchronous stuff _quitEvent.WaitOne(); // cleanup/shutdown and quit }
或者,使用Thread.Sleep(1):
static bool _quitFlag = false; static void Main() { Console.CancelKeyPress += delegate { _quitFlag = true; }; // kick off asynchronous stuff while (!_quitFlag) { Thread.Sleep(1); } // cleanup/shutdown and quit }
Mike.. 60
您始终希望阻止使用while循环,尤其是在强制代码重新检查变量时.它浪费CPU资源并降低程序速度.
我肯定会说第一个.
您始终希望阻止使用while循环,尤其是在强制代码重新检查变量时.它浪费CPU资源并降低程序速度.
我肯定会说第一个.
或者,更简单的解决方案就是:
Console.ReadLine();
你可以这样做(并删除CancelKeyPress
事件处理程序):
while(!_quitFlag) { var keyInfo = Console.ReadKey(); _quitFlag = keyInfo.Key == ConsoleKey.C && keyInfo.Modifiers == ConsoleModifiers.Control; }
不确定这是否更好,但我不喜欢调用Thread.Sleep
循环的想法..我认为阻止用户输入更清晰.
我更喜欢使用Application.Run
static void Main(string[] args) { //Do your stuff here System.Windows.Forms.Application.Run(); //Cleanup/Before Quit }
来自文档:
开始在当前线程上运行标准应用程序消息循环,没有表单.