int*_*bit 95 c# multithreading sleep manualresetevent
考虑一个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)
Mik*_*ike 60
您始终希望阻止使用while循环,尤其是在强制代码重新检查变量时.它浪费CPU资源并降低程序速度.
我肯定会说第一个.
Coc*_*lla 27
或者,更简单的解决方案就是:
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
Tho*_*que 13
你可以这样做(并删除CancelKeyPress事件处理程序):
while(!_quitFlag)
{
var keyInfo = Console.ReadKey();
_quitFlag = keyInfo.Key == ConsoleKey.C
&& keyInfo.Modifiers == ConsoleModifiers.Control;
}
Run Code Online (Sandbox Code Playgroud)
不确定这是否更好,但我不喜欢调用Thread.Sleep循环的想法..我认为阻止用户输入更清晰.
我更喜欢使用Application.Run
static void Main(string[] args) {
//Do your stuff here
System.Windows.Forms.Application.Run();
//Cleanup/Before Quit
}
Run Code Online (Sandbox Code Playgroud)
来自文档:
开始在当前线程上运行标准应用程序消息循环,没有表单.
也可以基于取消标记来阻止线程/程序。
token.WaitHandle.WaitOne();
Run Code Online (Sandbox Code Playgroud)
取消令牌时会发出 WaitHandle 信号。
我已经看到 Microsoft.Azure.WebJobs.JobHost 使用的这种技术,其中令牌来自 WebJobsShutdownWatcher(结束作业的文件观察器)的取消令牌源。
这可以控制程序何时结束。