考虑一个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
}
Run Code Online (Sandbox Code Playgroud)
或者,使用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
}
Run Code Online (Sandbox Code Playgroud) 我们每隔N分钟就要完成一系列任务.所以我们用a创建了一个任务执行器
do { DoWork(); }while(!stopRequested)
Run Code Online (Sandbox Code Playgroud)
现在我们希望在工作周期之间暂停一下.每个人似乎都认为Thread.Sleep()是魔鬼.我已经看到提到使用监视/事件的东西,但我们没有其他人告诉我们做的工作.我们只想每隔N分钟就像发条一样做.
那么有没有替代方案或者我找到了Thread.Sleep的有效使用方法?
另一篇帖子中有人提到WaitHandle.WaitOne()作为替代,但你不能用非静态方法调用它吗?或者至少我不能,因为我得到编译时错误..
非静态字段,方法或属性'System.Threading.WaitHandle.WaitOne(System.TimeSpan)'需要对象引用